文档

Java™教程
隐藏目录
为什么使用StAX?
教程: Java XML处理API (JAXP)
课程: XML的流式处理API

为什么使用StAX?

StAX项目由BEA公司发起,得到了Sun Microsystems的支持,JSR 173规范于2004年3月通过了Java Community Process最终的批准投票。StAX API的主要目标是通过提供一个简单的基于迭代器的API,将“解析控制权交给程序员。这允许程序员请求下一个事件(拉事件)并以过程化方式存储状态。” StAX的创建是为了解决两种最常见的解析API(SAX和DOM)的限制。

流式解析与DOM

一般来说,处理XML信息集有两种编程模型:流式解析和文档对象模型(DOM)。

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

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

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

拉解析与推解析

流式拉取解析是一种编程模型,其中客户端应用程序在需要与XML信息集进行交互时调用XML解析库的方法,也就是说,客户端只有在明确要求时才会获取(拉取)XML数据。

流式推送解析是一种编程模型,其中XML解析器在遇到XML信息集中的元素时向客户端发送(推送)XML数据,也就是说,解析器会发送数据,无论客户端是否准备好使用。

与推送解析相比,拉取解析在处理XML流时提供了几个优势:

StAX使用场景

StAX规范定义了API的多个使用场景:

对所有这些使用场景的完整讨论超出了本教程的范围。请参考StAX规范获取更多信息。

将StAX与其他JAXP API进行比较

作为JAXP系列中的一个API,StAX可以与SAX、TrAX和JDOM等其他API进行比较。在后两个API中,StAX不像TrAX或JDOM那样强大或灵活,但它也不需要像DOM基于的API那样多的内存或处理器负载才能发挥作用,并且在许多情况下,StAX可以比DOM-based API更高效。上述权衡DOM模型与流模型的成本/效益的论点在这里也适用。

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

下表总结了StAX、SAX、DOM和TrAX的比较特性。(该表格根据Jeff Ryan的文章《在您的XML工具箱中使用StAX?》进行了调整)。

XML解析器API功能总结

功能

StAX

SAX

DOM

TrAX

API类型

拉取、流式

推送、流式

内存树

XSLT规则

使用简便性

中等

中等

XPath功能

CPU和内存效率

良好

良好

各不相同

各不相同

仅向前

读取XML

写入XML

创建、读取、更新、删除


上一页: XML的流式API
下一页: StAX API