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中,主要包括: