Java StAX 解析器 - 概述



StAX 是一个基于 Java 的 API,用于以类似于 SAX 解析器的方式解析 XML 文档。但与 SAX 解析器不同,StAX 解析器 API 是一个简单的基于迭代器的 API,它将解析控制权交给客户端程序。它以只读正向的方式读取 XML 文档并将事件存储在迭代器中。

客户端可以根据每个事件的事件类型请求他想要访问的事件。

SAX 和 StAX 解析器之间的区别

以下是 SAX 和 StAX 解析器之间的一些显著区别:

SAX 解析器 StAX 解析器
基于推送的流解析器 基于拉取的流解析器
无法创建 XML 文档 无法创建 XML 文档
给予客户端程序较少的解析控制 给予客户端程序更多的解析控制
不是基于迭代器的 API 基于迭代器的 API
必须实现处理程序类 无需实现任何处理程序类
提供模式验证 不提供模式验证

环境设置

为了使用 StAX 解析器,你的应用程序的类路径中应该包含 **stax.jar**。

StAX 的特性

以下是 StAX API 的特性:

  • 从上到下读取 XML 文档并识别标记。

  • 按标记出现的顺序处理标记。

  • 向解析器报告标记的性质。

  • 根据识别的标记调用事件处理程序中的回调方法。

何时使用 Java StAX 解析器?

你应该在以下情况下使用 StAX 解析器:

  • 你想以线性方式从上到下处理 XML 文档。

  • 文档嵌套不深。

  • 你的 XML 文档非常大。

  • 要解决的问题只涉及 XML 文档的一部分。

  • 你有流数据(数据一旦被解析器看到就可用)。

StAX 的缺点

以下是 StAX 解析器的缺点:

  • 由于它是以只读正向的方式处理的,我们无法随机访问 XML 文档。

  • 不支持 XML 模式验证。
  • 如果你需要跟踪解析器已经看到的數據或解析器更改了项目顺序的位置,则必须自行编写代码并存储数据。

XMLEvent 接口

此接口提供 XML 文档所有组件的基本事件表示。事件类型区分每个事件,并相应地检索信息。此接口的一些最常用方法如下:

方法 描述
StartElement asStartElement() 从此事件检索 StartElement 对象。
EndElement asEndElement() 从此事件检索 EndElement 对象。
Characters asCharacters() 从此事件检索字符,例如 CDATA、空格等。
int getEventType() 返回此事件的整数代码。

XMLEventReader 接口

此接口提供事件迭代器,可用于在解析 XML 文档时迭代发生的事件。一些最常用的方法列在下面:

方法 描述
boolean hasNext() 如果 EventReader 中还有更多事件,则返回 true,否则返回 false。
XMLEvent nextEvent() 返回 EventReader 中的下一个 XMLEvent。
XMLEvent peek() 返回下一个 XMLEvent,而无需从流中读取它。

XMLEventWriter 接口

此接口通过添加事件来写入 XML 文档。一些最常用的方法列在下面:

方法 描述
void add(Event event) 将包含元素的事件添加到 XML。
void flush() 将任何缓存的事件写入流。
void close() 关闭与流相关的全部资源。

XMLStreamReader 接口

此接口提供了一种以只读正向方式有效读取 XML 事件的方法。其一些方法列在下面:

方法 描述
int next() 用于检索下一个事件。
boolean hasNext() 用于检查是否存在更多事件。
String getText() 用于获取当前解析事件的文本。
String getLocalName() 用于获取当前事件的本地名称。

XMLStreamWriter 接口

此接口提供写入 XML 文档的方法。一些最常用的方法列在下面:

方法 描述
void writeStartDocument() 将 XML 声明语句添加到输出流。
void writeStartElement(String localName) 添加具有给定名称的起始元素。
void writeEndElement(String localName) 添加具有给定名称的结束元素。
void writeAttribute(String localName, String value) 将具有指定名称和值的属性写入元素。
广告