Why StAX?

StAX 项目由 BEA 在 Sun Microsystems 的支持下牵头,并且JSR 173 规范在 2004 年 3 月通过了 Java Community Process final批准投票。StAXAPI 的主要目标是通过公开一个简单的迭代器为程序员提供“解析控制权”。基于 API 的程序。这使程序员可以请求下一个事件(拉事件),并允许以过程方式存储状态。”创建 StAX 是为了解决两个最普遍的解析 API(SAX 和 DOM)中的限制。

流与 DOM

一般来说,有两种用于处理 XML 信息集的编程模型:“流” **和“文档对象模型”(DOM)。

DOM 模型涉及创建内存对象,这些对象代表整个文档树和 XML 文档的完整信息集状态。一旦进入内存,DOM 树就可以自由导航和任意解析,因此为开发人员提供了最大的灵 Active。但是,这种灵 Active 的代价是潜在的大内存占用和大量处理器需求,因为在文档处理期间,文档的整个表示必须作为对象保存在内存中。在处理小型文档时,这可能不是问题,但是内存和处理器要求会随着文档大小的增加而迅速升级。

流是指一种编程模型,在该模型中,XML 信息集通常在应用程序运行时以实时方式实时传输,并且经常从动态信息源中动态地传输和解析,这些动态信息源的内容事先无法精确得知。而且,基于流的解析器可以立即开始生成输出,并且在使用它们后可以立即丢弃信息集元素并立即进行垃圾回收。尽管在某些情况下可以提供较小的内存占用空间,减少的处理器需求以及更高的性能,但流处理的主要折衷之处在于您一次只能在文档中的一个位置看到信息集状态。本质上,您仅限于文档的“纸板管”视图,这意味着在阅读 XML 文档之前,您需要知道要进行的处理。

当您的应用程序具有严格的内存限制时(例如运行 Java 平台,微型版(Java ME 平台)的手机),或者当应用程序需要同时处理多个请求(例如应用程序服务器)时,用于 XML 处理的流模型特别有用。实际上,可以说大多数 XML 业务逻辑可以从流处理中受益,并且不需要整个 DOM 树的内存内维护。

拉式分析与推式分析

流“拉解析”是指一种编程模型,其中 Client 端应用程序在需要与 XML 信息集进行交互时调用 XML 解析库上的方法,也就是说,Client 端仅在明确要求时才获取(拉)XML 数据。为了它。

流“推送分析”是指一种编程模型,在该模型中,当语法分析器遇到 XML 信息集中的元素时,XML 语法分析器会将 XML 数据发送(推送)到 Client 端,也就是说,无论 Client 端是否准备在那时使用它。

与 XML 流一起使用时,拉式解析提供了一些优于推式解析的优点:

  • 通过拉式解析,Client 端可以控制应用程序线程,并可以在需要时在解析器上调用方法。相比之下,通过推送处理,解析器控制应用程序线程,并且 Client 端只能接受来自解析器的调用。

  • 拉式解析库可以更小,并且即使与更复杂的文档相比,与推式库进行交互的 Client 端代码也要简单得多。

  • PullClient 可以通过一个线程一次读取多个文档。

  • StAX 拉解析器可以过滤 XML 文档,从而可以忽略 Client 端不必要的元素,并且可以支持非 XML 数据的 XML 视图。

StAX 用例

StAX 规范定义了 API 的许多用例:

  • Data binding

  • 解组 XML 文档

    • 编组 XML 文档

    • 并行文件处理

    • Wireless communication

  • 简单对象访问协议(SOAP)消息处理

  • 解析简单的可预测结构

    • 解析具有前向引用的图形表示

    • 解析 Web 服务描述语言(WSDL)

  • 虚拟数据源

  • 查看存储在数据库中的 XML 数据

    • 查看通过 XML 数据绑定创建的 Java 对象中的数据

    • 将 DOM 树作为事件流进行导航

  • 解析特定的 XML 词汇表

  • 流水线 XML 处理

对所有这些用例的完整讨论不在本类的范围内。请参考 StAX 规范以获取更多信息。

将 StAX 与其他 JAXP API 进行比较

作为 JAXP 家族中的 API,StAX 可以与其他 API 相比,与 SAX,TrAX 和 JDOM 进行比较。在后两者中,StAX 不如 TrAX 或 JDOM 强大或灵活,但是它不需要那么多的内存或处理器负载就可以使用,并且 StAX 在许多情况下都可以胜过基于 DOM 的 API。上面概述的相同论点适用于权衡 DOM 模型与流模型的成本/收益。

考虑到这一点,可以在 StAX 和 SAX 之间进行最接近的比较,正是在这里 StAX 提供了许多情况下都有益的功能。其中一些包括:

  • 启用 StAX 的 Client 端通常比 SAXClient 端更易于编码。虽然可以说 SAX 解析器在编写上稍微容易一些,但 StAX 解析器代码可以更小,并且 Client 端与解析器进行交互所必需的代码也更简单。

  • StAX 是 Double 向 API,这意味着它可以读取和写入 XML 文档。 SAX 是只读的,因此如果要编写 XML 文档,则需要另一个 API。

  • SAX 是推式 API,而 StAX 是拉式。上面概述的推式和拉式 API 之间的权衡在这里适用。

下表总结了 StAX,SAX,DOM 和 TrAX 的比较功能。 (该表改编自 Jeff Ryan 的StAX 是否属于您的 XML 工具箱?)。

  • XML Parser API 功能摘要*
FeatureStAXSAXDOMTrAX
API TypePull, streamingPush, streaming在 Memory 树中XSLT Rule
使用方便HighMediumHighMedium
XPath CapabilityNoNoYesYes
CPU 和内存效率GoodGoodVariesVaries
Forward OnlyYesYesNoNo
Read XMLYesYesYesYes
Write XMLYesNoYesYes
创建,读取,更新,删除NoNoYesNo