在Java中解析XML主要有DOM和SAX两种方式。DOM将文档整体载入内存生成节点树,便于随机访问与修改;SAX以事件驱动流式解析,边读边处理,内存占用低。理解它们的机制差异,是选型的基础。

DOM解析的原理与特点
DOM(Document Object Model)解析器会把整个XML文档读取到内存,构建一个父子的节点树。开发者可通过Document、Node等对象自由遍历、查询、新增或删除节点。
DOM的优点
- 结构直观,支持随机访问任意节点
- 可方便修改文档并重新输出
- API简单易用,适合复杂操作
DOM的缺点
- 文件过大时极易内存溢出
- 解析速度随文档增大明显下降
SAX解析的原理与特点
SAX(Simple API for XML)不建立树结构,而是逐行触发startElement()、characters()、endElement()等回调方法,适合只读处理。
SAX的优点
- 内存占用极小,可处理超大文件
- 解析速度快,适合一次性读取
SAX的缺点
- 只能顺序读取,不能回退或随机访问
- 不支持修改文档结构
- 编程模型较复杂,需自行维护状态
性能与场景对比
以下从多个维度比较两者:
| 维度 | DOM | SAX |
|---|---|---|
| 内存占用 | 高 | 低 |
| 随机访问 | 支持 | 不支持 |
| 修改能力 | 强 | 无 |
| 适合文件 | 小中型 | 大型 |
代码示例
DOM解析示例
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import java.io.File;
public class DomDemo {
public static void main(String[] args) throws Exception {
// 创建工厂与解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML文件得到Document树
Document doc = builder.parse(new File("test.xml"));
NodeList list = doc.getElementsByTagName("user");
System.out.println("用户节点数:" + list.getLength());
}
}
SAX解析示例
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
public class SaxDemo {
public static void main(String[] args) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
// 使用事件处理器处理标签
parser.parse(new File("test.xml"), new DefaultHandler() {
public void startElement(String uri, String local, String qName, Attributes attr) {
if ("user".equals(qName)) {
System.out.println("遇到user标签");
}
}
});
}
}
如何选择
若文件较小且需修改或频繁查询,选DOM;若文件很大且只需提取数据,选SAX。实际项目中也可结合使用,或用StAX折中。明确需求与资源限制,才能写出高效稳健的XML处理代码。