SAX是轻量、流式、只读的XML解析方式,基于事件驱动,边读取边触发回调,内存占用恒定,适合大文件一次性遍历;DOM则加载整个XML为内存树结构,支持随机访问和修改,但内存开销大。

Java中SAX(Simple API for XML)是一种基于事件驱动的XML解析方式,适合处理大文件、内存受限场景;它不构建整个文档树,而是边读取边触发回调方法。DOM(Document Object Model)则将整个XML加载进内存,构建成树状结构,便于随机访问和修改,但内存开销大。
什么是SAX解析:轻量、流式、只读
SAX是只读、单向、顺序解析——它像“流水线工人”,XML文件从头读到尾,遇到开始标签、结束标签、文本内容等就调用对应的方法(如startElement()、endElement()、characters())。你通过继承DefaultHandler并重写这些方法来提取数据。
- 不保存XML结构,不支持回溯或修改,无法获取父节点、兄弟节点等上下文关系
- 解析速度快,内存占用恒定(与文件大小基本无关)
- 适合日志分析、配置读取、ETL预处理等一次性遍历场景
- 需手动维护状态(比如用栈记录当前路径,判断嵌套层级)
什么是DOM解析:完整、可查、可改
DOM使用DocumentBuilder把整个XML解析成内存中的树形对象(Document),每个元素都是Node或其子类(如Element、Text)。你可以用XPath查询、遍历任意节点、增删改属性或子元素。
- 支持随机访问:比如直接getElementsByTagName("user")获取全部user节点
- 可修改文档结构后重新序列化输出
- 内存占用随XML体积线性增长,超大文件易OOM
- 启动稍慢(要等全部加载完才能操作)
SAX和DOM核心区别对比
二者本质是不同设计哲学的体现:
立即学习“Java免费学习笔记(深入)”;
- 内存模型:SAX无文档对象,DOM必须持有完整Document实例
- 访问方式:SAX只能顺序、单次读取;DOM支持任意位置反复读写
- 适用规模:SAX适合GB级日志/XML流;DOM适合KB~MB级配置文件、模板文档
- 开发成本:SAX逻辑分散在回调里,状态管理易出错;DOM代码集中、直观,但要注意GC压力
- 线程安全:SAX解析器本身不是线程安全的,但每个解析可独立运行;DOM的Document对象非线程安全,多线程需同步或克隆
怎么选:看需求,不看流行度
没有绝对优劣,只有是否匹配场景:
- 只要提取几个字段、文件很大 → 选SAX(或StAX)
- 要反复查询、需要XPath、会修改再保存 → 选DOM
- 既要流式又要一定随机能力 → 考虑StAX(拉模式,比SAX更可控)
- 项目已用Spring/MyBatis等框架 → 它们内部多封装了DOM或JAXB,无需手写SAX










