XML的简单API(SAX)是什么 SAX事件驱动模型解析方法

27次阅读

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

XML的简单API(SAX)是什么 SAX事件驱动模型解析方法

SAX(Simple API for XML)是一种轻量、快速、低内存占用xml解析方式,核心是事件驱动模型:它不把整个XML文档加载进内存,而是边读边触发回调,像“听广播”一样——遇到开始标签、结束标签、文本内容等就立刻通知你,由你决定怎么处理。

它怎么工作:边读边“喊话”

SAX解析器从XML文件开头逐字扫描,一旦识别出结构特征,就调用你预先写好的方法。比如:

  • startElement():读到 <user id="101"></user> 时触发,你能拿到标签名、属性值(如 id="101"
  • characters():读到 <name>张三</name> 中的“张三”时触发,注意要截取有效字符段(ch[start]...ch[start+Length-1]
  • endElement():读到 时触发,表示一个元素完整闭合,适合做对象封装或存入集合
  • startDocument() / endDocument():分别在文档最开头和结尾触发,适合初始化或收尾操作

为什么选SAX而不是dom

关键看场景需求:

XML的简单API(SAX)是什么 SAX事件驱动模型解析方法

乾坤圈新媒体矩阵管家

新媒体账号、门店矩阵智能管理系统

XML的简单API(SAX)是什么 SAX事件驱动模型解析方法 219

查看详情 XML的简单API(SAX)是什么 SAX事件驱动模型解析方法

  • 你要解析几十MB的配置日志、大体积数据导出文件,或跑在android等内存受限设备上 → SAX更稳
  • 你只关心其中几个字段(比如所有 <title></title> 的文本),不需反复查父节点或修改结构 → SAX够用且更快
  • 你不需要随机访问、回溯、增删改XML树 → 就别用DOM,它会把整棵树塞进内存,容易OOM

实际写法要点

三步就能跑起来,重点在Handler类的设计:

  • 继承 DefaultHandler,重写关键回调方法(至少 startElement / characters / endElement)
  • 用一个变量(如 currentTag)记住当前正在读的标签名,避免在 characters 中不知道文本属于谁
  • 在 startElement 里根据标签名新建对象,在 characters 里存内容,在 endElement 里判断是否该保存或组装
  • 解析调用简单:saxParser.parse(inputstream, new MyHandler())

基本上就这些。不复杂但容易忽略细节,比如 characters 可能被多次调用(超长文本会分片)、属性要用 attributes.getValue("name") 而不是硬索引。用对了,万行XML也能毫秒级扫完。

text=ZqhQzanResources