# 为何选择 StAX？

> 原文： [https://docs.oracle.com/javase/tutorial/jaxp/stax/why.html](https://docs.oracle.com/javase/tutorial/jaxp/stax/why.html)

StAX 项目由 BEA 在 Sun Microsystems 的支持下率先实现， [JSR 173 规范](http://jcp.org/en/jsr/detail?id=173)于 2004 年 3 月通过了 Java Community Process 最终批准投票.StAX API 的主要目标是提供“解析控制”通过公开一个简单的基于迭代器的 API 给程序员。这允许程序员请求下一个事件（拉动事件）并允许以过程方式存储状态。“创建 StAX 是为了解决两个最流行的解析 API，SAX 和 DOM 中的限制。

## 流媒体与 DOM

一般来说，有两种编程模型可用于处理 XML 信息集：**流式传输**和**文档对象模型**（DOM）。

DOM 模型涉及创建表示整个文档树的内存中对象和 XML 文档的完整信息集状态。一旦进入内存，DOM 树可以自由导航并任意解析，因此为开发人员提供了最大的灵活性。然而，这种灵活性的成本是潜在的大内存占用和显着的处理器要求，因为文档的整个表示必须在文档处理期间作为对象保存在存储器中。使用小型文档时，这可能不是问题，但内存和处理器要求可以随文档大小快速升级。

流式传输是指一种编程模型，其中 XML 信息集在应用程序运行时通常是实时地串行传输和解析，并且通常来自其内容未事先准确知道的动态源。此外，基于流的解析器可以立即开始生成输出，并且可以丢弃信息集元素并在使用它们之后立即收集垃圾。虽然在某些情况下提供更小的内存占用，更低的处理器要求和更高的性能，但流处理的主要权衡是您只能在文档中一次看到一个位置的信息集状态。您基本上只限于文档的“纸板管”视图，这意味着您需要在读取 XML 文档之前知道要执行的处理。

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

## 拉解析与推力解析

Streaming **pull 解析**是指一种编程模型，当客户端应用程序需要与 XML 信息集交互时，它调用 XML 解析库上的方法 - 也就是说，客户端只在获取（拉取）XML 数据时明确地要求它。

Streaming **推送解析**指的是一种编程模型，其中 XML 解析器在解析器遇到 XML 信息集中的元素时将 XML 数据发送（推送）到客户端 - 也就是说，解析器发送数据是否是客户端已准备好在那时使用它。

在处理 XML 流时，pull 解析比推送解析提供了几个优点：

*   通过 pull 解析，客户端控制应用程序线程，并在需要时调用解析器上的方法。相反，使用推送处理，解析器控制应用程序线程，客户端只能接受来自解析器的调用。

*   拉解析库可以小得多，并且与推送库交互的客户端代码比使用推送库简单得多，即使对于更复杂的文档也是如此。

*   Pull 客户端可以使用单个线程一次读取多个文档。

*   StAX pull 解析器可以过滤 XML 文档，以便可以忽略客户端不需要的元素，并且它可以支持非 XML 数据的 XML 视图。

## StAX 用例

StAX 规范为 API 定义了许多用例：

*   数据绑定

    *   解组 XML 文档

    *   编组 XML 文档

    *   并行文档处理

    *   无线通信

*   简单对象访问协议（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 提供的功能在许多情况下都是有益的。其中一些包括：

*   启用 S​​tAX 的客户端通常比 SAX 客户端更容易编码。虽然可以说 SAX 解析器稍微容易编写，但是 StAX 解析器代码可以更小，并且客户端与解析器交互所需的代码更简单。

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

*   SAX 是推送 API，而 StAX 则是拉动。上面概述的 push 和 pull API 之间的权衡取决于此处。

下表总结了 StAX，SAX，DOM 和 TrAX 的比较功能。 （该表改编自[你的 XML 工具箱中的 StAX 属性吗？](http://www.developer.com/xml/article.php/3397691)作者：Jeff Ryan）。

<caption>XML Parser API Feature Summary</caption> <colgroup><col width="26%"> <col width="18%"> <col width="19%"> <col width="19%"> <col width="15%"></colgroup>
| 

特征

 | 

StAX 的

 | 

SAX

 | 

DOM

 | 

TrAX 的

 |
| :-- | :-- | :-- | :-- | :-- |
| API 类型 | 拉，流 | 推送，流媒体 | 在内存树中 | XSLT 规则 |
| 便于使用 | 高 | 介质 | 高 | 介质 |
| XPath 功能 | 没有 | 没有 | 是 | 是 |
| CPU 和内存效率 | 好 | 好 | 不定 | 不定 |
| 仅转发 | 是 | 是 | 没有 | 没有 |
| 阅读 XML | 是 | 是 | 是 | 是 |
| 写 XML | 是 | 没有 | 是 | 是 |
| 创建，读取，更新，删除 | 没有 | 没有 | 是 | 没有 |