SAX是一种轻量、快速、低内存占用的事件驱动XML解析方式,通过startElement、characters、endElement等回调方法边读边处理,适用于大文件或内存受限场景,无需加载整棵树。

SAX(Simple API for XML)是一种轻量、快速、低内存占用的XML解析方式,核心是事件驱动模型:它不把整个XML文档加载进内存,而是边读边触发回调,像“听广播”一样——遇到开始标签、结束标签、文本内容等就立刻通知你,由你决定怎么处理。
它怎么工作:边读边“喊话”
SAX解析器从XML文件开头逐字扫描,一旦识别出结构特征,就调用你预先写好的方法。比如:
-
startElement():读到
时触发,你能拿到标签名、属性值(如id="101") -
characters():读到
中的“张三”时触发,注意要截取有效字符段(张三 ch[start]...ch[start+length-1]) -
endElement():读到
时触发,表示一个元素完整闭合,适合做对象封装或存入集合 - startDocument() / endDocument():分别在文档最开头和结尾触发,适合初始化或收尾操作
为什么选SAX而不是DOM
关键看场景需求:
- 你要解析几十MB的配置日志、大体积数据导出文件,或跑在Android等内存受限设备上 → SAX更稳
- 你只关心其中几个字段(比如所有
的文本),不需反复查父节点或修改结构 → SAX够用且更快 - 你不需要随机访问、回溯、增删改XML树 → 就别用DOM,它会把整棵树塞进内存,容易OOM
实际写法要点
三步就能跑起来,重点在Handler类的设计:
- 继承
DefaultHandler,重写关键回调方法(至少 startElement / characters / endElement) - 用一个变量(如
currentTag)记住当前正在读的标签名,避免在 characters 中不知道文本属于谁 - 在 startElement 里根据标签名新建对象,在 characters 里存内容,在 endElement 里判断是否该保存或组装
- 解析调用简单:
saxParser.parse(inputStream, new MyHandler())
基本上就这些。不复杂但容易忽略细节,比如 characters 可能被多次调用(超长文本会分片)、属性要用 attributes.getValue("name") 而不是硬索引。用对了,万行XML也能毫秒级扫完。











