StAX 解析:基于拉模式的 XML 解析方式
StAX(Streaming API for XML)是一种介于 DOM 和 SAX 之间的 XML 解析标准,它结合了 DOM 的灵活性和 SAX 的高效性,采用 “拉模式”(Pull Model)让应用程序主动控制解析过程,相比 SAX 的 “推模式”(Push Model)更易于使用。
StAX 解析的核心原理
StAX 解析的核心思想是 “应用程序主导解析流程”,其工作方式如下:
- 解析器初始化:创建 StAX 解析器(如
XMLStreamReader
),关联 XML 文档。 - 主动拉取事件:应用程序通过调用
next()
等方法主动获取下一个解析事件(如元素开始、文本内容、元素结束等)。 - 事件处理:根据拉取到的事件类型(如
START_ELEMENT
、CHARACTERS
、END_ELEMENT
),应用程序自行决定如何处理(如提取数据、跳过节点)。 - 按需终止:解析过程完全由应用程序控制,可随时停止解析(如找到目标数据后)。
这种 “拉模式” 的优势在于:应用程序无需预先定义事件处理器,而是在需要时主动获取事件,代码逻辑更直观,尤其适合处理复杂 XML 结构。
StAX 的核心组件与事件类型
核心接口
StAX 提供了两种主要的解析接口,分别适用于不同场景:
XMLStreamReader
:只读接口,用于从 XML 文档中拉取事件,是 StAX 的核心接口。XMLEventReader
:基于事件对象的只读接口,将解析事件封装为XMLEvent
对象,提供更面向对象的操作方式。
其中,XMLStreamReader
因轻量高效而更常用,以下主要围绕该接口展开。
常用方法(XMLStreamReader
)
方法 | 作用 |
---|---|
int next() |
推进到下一个事件,返回事件类型(如START_ELEMENT )。 |
String getLocalName() |
获取当前元素的本地名称(不带命名空间前缀)。 |
String getText() |
获取当前文本节点的内容。 |
int getAttributeCount() |
获取当前元素的属性数量。 |
String getAttributeLocalName(int index) |
获取指定索引的属性名称。 |
String getAttributeValue(int index) |
获取指定索引的属性值。 |
String getAttributeValue(String namespaceURI, String localName) |
根据命名空间和名称获取属性值。 |
boolean hasNext() |
判断是否还有下一个事件。 |
常见事件类型(XMLStreamConstants
)
XMLStreamReader
的next()
方法返回的事件类型定义在XMLStreamConstants
中,主要包括:
事件类型常量 | 含义 |
---|---|
START_DOCUMENT |
文档开始事件 |
END_DOCUMENT |
文档结束事件 |
START_ELEMENT |
元素开始事件(如<book> ) |
END_ELEMENT |
元素结束事件(如</book> ) |
CHARACTERS |
文本内容事件 |
ATTRIBUTE |
属性事件(较少直接使用,通常在START_ELEMENT 中处理属性) |
COMMENT |
注释事件 |
SPACE |
空白字符事件 |
StAX 解析实战示例
以解析 MyBatis 的mapper.xml
为例,演示XMLStreamReader
的使用:
示例 XML 文档(UserMapper.xml
)
1 |
|
使用XMLStreamReader
解析
1 | import javax.xml.stream.XMLInputFactory; |
输出结果:
1 | namespace: com.example.UserMapper |
StAX 与其他解析方式的对比
解析方式 | 核心模式 | 内存占用 | 灵活性 | 适用场景 |
---|---|---|---|---|
DOM | 树形结构 | 高(加载整个文档) | 高(随机访问、修改) | 中小型文档、需修改或频繁查询 |
SAX | 推模式(事件驱动) | 低(流式处理) | 低(单向解析,需维护状态) | 大型文档、仅读取数据 |
StAX | 拉模式(应用主导) | 低(流式处理) | 中(主动控制,可跳转) | 大型文档、需灵活处理事件 |
StAX 的优势
- 应用程序主导:无需预先定义事件处理器,解析流程更直观,易于调试。
- 低内存占用:流式处理,不加载整个文档,适合大型 XML。
- 灵活性高:可根据需求跳过无关节点,或在解析过程中动态调整逻辑。
- 支持写入:StAX 提供
XMLStreamWriter
接口,可方便地生成 XML 文档(DOM 和 SAX 的写入能力较弱)。
StAX 的局限性
- 不支持随机访问:虽比 SAX 灵活,但仍无法像 DOM 那样自由跳转节点。
- 状态管理:对于嵌套较深的 XML,仍需手动跟踪节点层级关系。
StAX 的典型应用场景
- 大型 XML 文档处理:如日志文件、数据备份文件等,StAX 的低内存特性可高效解析。
- 选择性解析:只需提取 XML 中的部分数据(如特定节点),可通过拉模式快速定位并跳过无关内容。
- XML 生成:通过
XMLStreamWriter
可简洁地生成 XML,比 DOM 更高效。 - 多文档并行处理:拉模式允许同时处理多个 XML 文档,适合批量数据处理。
v1.3.10