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 流一起使用时,拉式解析提供了一些优于推式解析的优点:

StAX 用例

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

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

将 StAX 与其他 JAXP API 进行比较

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

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

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

Feature StAX SAX DOM TrAX
API Type Pull, streaming Push, streaming 在 Memory 树中 XSLT Rule
使用方便 High Medium High Medium
XPath Capability No No Yes Yes
CPU 和内存效率 Good Good Varies Varies
Forward Only Yes Yes No No
Read XML Yes Yes Yes Yes
Write XML Yes No Yes Yes
创建,读取,更新,删除 No No Yes No
首页