SAX解析是事件驱动的流式XML处理方式,边读边触发回调,内存占用恒定且适合大文件或内存受限场景;DOM则将XML加载为内存树,支持随机访问但内存消耗大。

SAX解析是一种事件驱动的流式XML处理方式,它不把整个文档加载进内存,而是边读边触发回调——比如遇到就通知“元素开始”,读到文本内容就传给你,碰到再通知“元素结束”。你只需要在对应事件里写处理逻辑,其他事由解析器自动完成。
核心区别:工作模式完全不同
DOM把XML当成一棵树,一次性全搬进内存;SAX把它当成一条流水线,只留当前正在处理的那一小段。
- 内存占用:DOM随文件大小线性增长,100MB XML可能吃掉几百MB堆内存;SAX基本恒定,几KB到几十KB就够用
- 访问能力:DOM支持任意跳转、反复读取、增删改查;SAX只能从头到尾走一遍,错过就没了
- 适用动作:DOM适合改配置、生成新XML、做结构校验;SAX适合抽字段、统计数量、导入数据库、过滤日志
什么时候该选SAX
不是“能不能”,而是“值不值得”用DOM。如果你的XML超过10MB,或者运行环境内存紧张(比如Android低端机、嵌入式设备、函数计算FC),SAX几乎是默认选项。
- 日志分析:逐行提取时间戳、错误码、耗时字段
- 大数据导入:把XML里的订单逐条写进数据库,不缓存整份数据
- 实时流处理:接收网络流式XML报文,边收边解析,不等全文到达
什么时候DOM更合适
当XML本身不大(通常建议<5MB),且你需要灵活操作结构时,DOM写起来更直觉、调试更方便。
- 读取应用配置文件(如
web.xml或自定义config.xml) - 需要修改某个节点属性后重新输出XML
- 要多次查询不同路径(比如先找
//order,再查每个order/item下的价格)
还有别的选择吗
现代开发中,SAX和DOM已不是唯一答案:
- StAX(拉式解析):比SAX更可控,你可以决定“读下一个事件”,而不是被动响应;Java原生支持,代码比SAX简洁
- JAXB:直接把XML映射成Java对象,适合结构固定、追求开发效率的场景
- 第三方库(如Jackson XML、SimpleXML):API更轻量,集成更顺滑,尤其适合微服务间XML交互










