XML解析器分DOM、SAX、StAX三类:DOM树形加载适合随机读写但内存高;SAX事件驱动单向读取内存省但不可回溯;StAX拉模式可控读写兼备但需手动管理层级。

XML解析器主要分三类:DOM、SAX 和 StAX,它们核心差异在于内存使用方式、访问模型和适用场景。
DOM:树形结构,适合随机读写
DOM 将整个 XML 文档一次性加载进内存,构建成一棵完整的节点树。你可以任意跳转、查找、修改、增删节点,还能回写成文件。
- 优点:支持随机访问,操作直观;天然支持修改和生成 XML
- 缺点:内存占用大,文档越大越明显;解析启动慢(必须等全部加载完才开始处理)
- 适用:小到中等 XML 文件;需要多次遍历或动态编辑的场景(如配置文件解析、模板生成)
SAX:事件驱动,单向流式读取
SAX 是“推模式”解析器:它边读边触发事件(如 startElement、endElement、characters),你通过注册回调函数来响应这些事件。
- 优点:内存极省,不保留文档结构;启动快,适合超大文件
- 缺点:只能顺序读取,无法回溯;不保存上下文,需自行维护状态(比如当前在哪个父元素下);不能写 XML
- 适用:日志分析、ETL 数据抽取、只关心部分标签内容的场景
StAX:拉模式流式解析,读写兼备
StAX 是“拉模式”,像用迭代器遍历 XML:你主动调用 next() 或 hasNext() 控制解析节奏,每次获取一个事件(START_ELEMENT、CHARACTERS 等)。
- 优点:内存友好,可控性强;既可读也可写(支持生成 XML);比 SAX 更易编写和调试
- 缺点:仍不支持随机访问;需要手动管理指针位置和嵌套层级
- 适用:大文件解析且需一定逻辑控制(如按条件跳过某段);需要生成 XML 的集成场景(如 Web Service 消息组装)
DOM4J、JDOM 等是第三方封装库,底层多基于 SAX 或 DOM 实现,提供了更友好的 API,但本质仍归属上述三类思想之一。选型时,先看文件大小和内存约束,再看是否需要修改、回写或随机访问——不复杂但容易忽略关键限制。










