javax.xml.parsers是Java SE平台中内置的XML解析API包,属于Java标准库的一部分,不需要额外引入第三方依赖就可以使用。这个包主要提供了文档对象模型(DOM)和简单API for XML(SAX)两种解析方式的工厂类和核心解析类,是Java原生处理XML文档的基础入口。

javax.xml.parsers包的核心组成
这个包下的核心类主要分为两类,分别对应两种主流的XML解析模式:
- DOM解析相关类:DocumentBuilderFactory是DOM解析器的工厂类,用于创建DocumentBuilder实例;DocumentBuilder是实际的DOM解析器,负责将XML文档解析为DOM树结构。
- SAX解析相关类:SAXParserFactory是SAX解析器的工厂类,用于创建SAXParser实例;SAXParser是实际的SAX解析器,基于事件驱动模式解析XML文档。
使用DOM模式解析XML的步骤和示例
DOM解析会将整个XML文档加载到内存中,形成一棵DOM树,开发者可以随机访问树中的节点,适合需要频繁修改或者遍历整个文档的场景。
步骤说明
- 创建DocumentBuilderFactory实例
- 通过工厂实例创建DocumentBuilder实例
- 调用DocumentBuilder的parse方法解析XML文件,得到Document对象
- 通过Document对象获取根节点,再遍历子节点获取需要的数据
代码示例
假设我们有一个名为user.xml的文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
</user>
<user id="2">
<name>李四</name>
<age>30</age>
</user>
</users>
使用DOM解析该文件的完整代码如下:
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;
import java.io.File;
public class DomXmlParser {
public static void main(String[] args) {
try {
// 创建DOM解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DOM解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML文件,得到Document对象
Document document = builder.parse(new File("user.xml"));
// 获取根节点
Element root = document.getDocumentElement();
System.out.println("根节点名称:" + root.getNodeName());
// 获取所有user节点
NodeList userNodes = root.getElementsByTagName("user");
// 遍历user节点
for (int i = 0; i < userNodes.getLength(); i++) {
Node userNode = userNodes.item(i);
if (userNode.getNodeType() == Node.ELEMENT_NODE) {
Element userElement = (Element) userNode;
// 获取id属性
String id = userElement.getAttribute("id");
// 获取name子节点内容
String name = userElement.getElementsByTagName("name").item(0).getTextContent();
// 获取age子节点内容
String age = userElement.getElementsByTagName("age").item(0).getTextContent();
System.out.println("用户ID:" + id + ",姓名:" + name + ",年龄:" + age);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用SAX模式解析XML的步骤和示例
SAX解析是基于事件驱动的,不会将整个文档加载到内存中,而是逐行读取XML内容,遇到不同节点时触发对应的事件回调,适合处理大体积XML文档的场景。
步骤说明
- 创建SAXParserFactory实例
- 通过工厂实例创建SAXParser实例
- 自定义继承DefaultHandler的事件处理类,重写需要的方法
- 调用SAXParser的parse方法,传入XML文件和自定义Handler实例
代码示例
同样解析上面的user.xml文件,使用SAX模式的代码如下:
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;
import java.io.File;
public class SaxXmlParser {
public static void main(String[] args) {
try {
// 创建SAX解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 创建SAX解析器
SAXParser parser = factory.newSAXParser();
// 创建自定义事件处理器
UserHandler handler = new UserHandler();
// 解析XML文件
parser.parse(new File("user.xml"), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 自定义SAX事件处理器
class UserHandler extends DefaultHandler {
private String currentElement = "";
private String currentId = "";
private String currentName = "";
private String currentAge = "";
// 遇到元素开始标签时触发
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
currentElement = qName;
if ("user".equals(qName)) {
// 获取user节点的id属性
currentId = attributes.getValue("id");
}
}
// 遇到元素文本内容时触发
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch, start, length).trim();
if (!content.isEmpty()) {
if ("name".equals(currentElement)) {
currentName = content;
} else if ("age".equals(currentElement)) {
currentAge = content;
}
}
}
// 遇到元素结束标签时触发
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("user".equals(qName)) {
System.out.println("用户ID:" + currentId + ",姓名:" + currentName + ",年龄:" + currentAge);
// 重置临时变量
currentId = "";
currentName = "";
currentAge = "";
}
currentElement = "";
}
}
两种解析模式的对比
开发者可以根据实际需求选择合适的解析模式,两者的核心差异如下:
| 对比维度 | DOM解析 | SAX解析 |
|---|---|---|
| 内存占用 | 较高,需要加载整个文档到内存 | 较低,逐行读取不加载全文档 |
| 访问方式 | 随机访问,可修改节点内容 | 顺序访问,只能读取不能修改 |
| 适用场景 | 小体积XML,需要修改或频繁遍历 | 大体积XML,只需要读取数据 |
| 实现复杂度 | 较低,API更直观 | 较高,需要自定义事件处理逻辑 |
注意事项
- 解析XML时需要处理异常,比如文件不存在、XML格式错误等情况,要做好异常捕获和提示。
- 如果XML文件有自定义命名空间,需要在创建工厂实例后设置对应的特性,避免解析出错。
- 使用DOM解析时,如果XML体积过大可能会导致内存溢出,此时应该优先选择SAX模式。
javax.xml.parsersXML解析Java原生APIDOM解析SAX解析修改时间:2026-07-04 19:36:30