javax.xml包全面教程:DOM和SAX解析、XSLT转换与XML验证
javax.xml是Java标准库中处理XML的核心包,提供了解析、转换和验证等功能。本文全面介绍了其主要组件,包括DocumentBuilder、SAXParser、Transformer和Validator等,并提供了DOM解析、SAX解析、XSLT转换和XML Schema验证的完整代码示例。通过详细的实例演示和可运行的代码,帮助开发者快速掌握XML处理技术,提升开发效率。
javax.xml 包是 Java 标准库中用于处理 XML 的核心包,提供了 XML 解析、转换、验证等功能。主要包含以下核心组件:
主要类和接口
1. 解析相关
DocumentBuilder - DOM 解析器
SAXParser - SAX 解析器
XMLReader - SAX2 解析器
2. 转换相关
Transformer - XSLT 转换器
TransformerFactory - 转换器工厂
3. 验证相关
Schema - XML Schema
Validator - XML 验证器
示例代码
1. DOM 解析 XML
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOMParserExample {
public static void main(String[] args) {
try {
// 创建 DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析 XML 文件
Document document = builder.parse("books.xml");
document.getDocumentElement().normalize();
// 获取根元素
System.out.println("根元素: " + document.getDocumentElement().getNodeName());
// 获取所有 book 元素
NodeList nodeList = document.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String id = element.getAttribute("id");
String title = element.getElementsByTagName("title").item(0).getTextContent();
String author = element.getElementsByTagName("author").item(0).getTextContent();
String price = element.getElementsByTagName("price").item(0).getTextContent();
System.out.println("图书 ID: " + id);
System.out.println("标题: " + title);
System.out.println("作者: " + author);
System.out.println("价格: " + price);
System.out.println("------------");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}2. SAX 解析 XML
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParserExample {
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean bTitle = false;
boolean bAuthor = false;
boolean bPrice = false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) {
if (qName.equalsIgnoreCase("book")) {
String id = attributes.getValue("id");
System.out.println("图书 ID: " + id);
}
if (qName.equalsIgnoreCase("title")) {
bTitle = true;
}
if (qName.equalsIgnoreCase("author")) {
bAuthor = true;
}
if (qName.equalsIgnoreCase("price")) {
bPrice = true;
}
}
@Override
public void characters(char[] ch, int start, int length) {
if (bTitle) {
System.out.println("标题: " + new String(ch, start, length));
bTitle = false;
}
if (bAuthor) {
System.out.println("作者: " + new String(ch, start, length));
bAuthor = false;
}
if (bPrice) {
System.out.println("价格: " + new String(ch, start, length));
bPrice = false;
}
}
};
saxParser.parse("books.xml", handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}3. XSLT 转换 XML
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
public class XSLTExample {
public static void main(String[] args) {
try {
// 创建转换器工厂
TransformerFactory factory = TransformerFactory.newInstance();
// 创建 XSLT 转换器
Transformer transformer = factory.newTransformer(
new StreamSource(new File("transform.xsl")));
// 执行转换
transformer.transform(
new StreamSource(new File("books.xml")),
new StreamResult(new File("output.html")));
System.out.println("转换完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}4. XML Schema 验证
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
public class XMLValidationExample {
public static void main(String[] args) {
try {
// 创建 Schema 工厂
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// 创建 Schema
Schema schema = factory.newSchema(new File("books.xsd"));
// 创建验证器
Validator validator = schema.newValidator();
// 验证 XML 文件
validator.validate(new StreamSource(new File("books.xml")));
System.out.println("XML 验证成功!");
} catch (Exception e) {
System.out.println("验证失败: " + e.getMessage());
e.printStackTrace();
}
}
}示例 XML 文件 (books.xml)
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<title>Java 编程思想</title>
<author>Bruce Eckel</author>
<price>89.00</price>
</book>
<book id="2">
<title>Effective Java</title>
<author>Joshua Bloch</author>
<price>79.00</price>
</book>
<book id="3">
<title>Spring 实战</title>
<author>Craig Walls</author>
<price>69.00</price>
</book>
</bookstore>主要特点
1、标准化 - 遵循 W3C XML 标准
2、可扩展 - 支持自定义解析器和处理器
3、多解析方式 - 支持 DOM、SAX、StAX 等解析模式
4、安全性 - 提供 XML 外部实体攻击防护
5、性能优化 - 支持各种性能调优选项
最后更新于3月前
本文由人工编写,AI优化,转载请注明原文地址: Java javax.xml包完整使用指南:XML解析、转换与验证实战
推荐阅读
评论 (3)
发表评论
昵称:加载中...
沉默的狼2025-12-02 13:18:24
示例代码很实用,特别是DOM解析部分,帮我快速理解了流程。如果能补充一些SAX和StAX解析的对比就更好了,感谢分享!
莎拉Sara2025-11-24 15:50:51
很实用的指南!示例代码清晰,帮我快速理解了DOM解析。请问在处理大型XML文件时,SAX和DOM哪种方式更推荐?
超腾开源2025-11-24 19:58:09
在处理大型XML文件时,SAX(Simple API for XML)通常是更推荐的选择。DOM是将整个XML文档加载到内存中,构建树形结构,内存占用高,处理大型文件时性能瓶颈明显(可能内存溢出)。SAX基于事件流逐行解析,无需预加载整个文档,内存占用极低(仅处理当前节点),适合顺序处理大型文件(最高效)。