该教程是为JDK 8编写的。本页描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发行说明。
StAX项目由BEA公司发起,得到了Sun Microsystems的支持,JSR 173规范于2004年3月通过了Java Community Process最终的批准投票。StAX API的主要目标是通过提供一个简单的基于迭代器的API,将“解析控制权交给程序员。这允许程序员请求下一个事件(拉事件)并以过程化方式存储状态。” StAX的创建是为了解决两种最常见的解析API(SAX和DOM)的限制。
一般来说,处理XML信息集有两种编程模型:流式解析和文档对象模型(DOM)。
DOM模型涉及创建表示整个文档树和XML文档完整信息集状态的内存对象。一旦在内存中,DOM树可以自由导航和任意解析,因此为开发人员提供了最大的灵活性。然而,这种灵活性的代价是可能占用大量内存和显著的处理器需求,因为整个文档的表示必须作为对象在文档处理的整个过程中保持在内存中。当处理小型文档时,这可能不是问题,但是随着文档大小的增加,内存和处理器需求会迅速升高。
流式解析是指在应用程序运行时串行传输和解析XML信息集的编程模型,通常是实时的,并且通常来自于事先不完全了解内容的动态源。此外,基于流的解析器可以立即开始生成输出,并且在使用后可以立即丢弃和进行垃圾回收的信息集元素。虽然提供了更小的内存占用,降低了处理器需求,并在某些情况下提供了更高的性能,但是流处理的主要权衡是您只能一次在文档中查看一个位置的信息集状态。您基本上只能看到文档的“纸板筒”视图,这意味着您在阅读XML文档之前需要知道要进行的处理。
流式处理XML的模型在应用程序有严格的内存限制时特别有用,例如运行Java平台微版(Java ME平台)的手机,或者当应用程序需要同时处理多个请求时,例如应用程序服务器。实际上,可以说大部分XML业务逻辑可以从流式处理中获益,并不需要在内存中维护整个DOM树。
流式拉取解析是一种编程模型,其中客户端应用程序在需要与XML信息集进行交互时调用XML解析库的方法,也就是说,客户端只有在明确要求时才会获取(拉取)XML数据。
流式推送解析是一种编程模型,其中XML解析器在遇到XML信息集中的元素时向客户端发送(推送)XML数据,也就是说,解析器会发送数据,无论客户端是否准备好使用。
与推送解析相比,拉取解析在处理XML流时提供了几个优势:
通过拉取解析,客户端控制应用程序线程,并且可以在需要时调用解析器的方法。相比之下,通过推送处理,解析器控制应用程序线程,客户端只能接受来自解析器的调用。
与推送库相比,拉取解析库可以更小,并且与这些库交互的客户端代码可以更简单,即使对于更复杂的文档也是如此。
拉取客户端可以使用单个线程同时读取多个文档。
StAX拉取解析器可以过滤XML文档,使客户端不需要的元素被忽略,并且可以支持非XML数据的XML视图。
StAX规范定义了API的多个使用场景:
解组XML文档
组装XML文档
并行文档处理
无线通信
解析简单可预测的结构
解析具有前向引用的图形表示
解析Web服务描述语言(WSDL)
虚拟数据源
查看存储在数据库中的XML数据
查看由XML数据绑定创建的Java对象中的数据
将DOM树作为事件流进行导航
解析特定的XML词汇
管道化XML处理
对所有这些使用场景的完整讨论超出了本教程的范围。请参考StAX规范获取更多信息。
作为JAXP系列中的一个API,StAX可以与SAX、TrAX和JDOM等其他API进行比较。在后两个API中,StAX不像TrAX或JDOM那样强大或灵活,但它也不需要像DOM基于的API那样多的内存或处理器负载才能发挥作用,并且在许多情况下,StAX可以比DOM-based API更高效。上述权衡DOM模型与流模型的成本/效益的论点在这里也适用。
考虑到这一点,StAX和SAX之间的比较最为接近,StAX在许多情况下都提供了有益的功能,其中一些包括:
与SAX客户端相比,使用StAX的客户端通常更容易编写。虽然可以争论说编写SAX解析器稍微更容易,但StAX解析器的代码可能更小,与解析器交互所需的代码更简单。
StAX是一个双向API,可以读取和写入XML文档。SAX仅支持读取,如果要写入XML文档,则需要另一个API。
SAX是推模式API,而StAX是拉模式。上面提到的推模式和拉模式之间的权衡在这里也适用。
下表总结了StAX、SAX、DOM和TrAX的比较特性。(该表格根据Jeff Ryan的文章《在您的XML工具箱中使用StAX?》进行了调整)。
功能 |
StAX |
SAX |
DOM |
TrAX |
---|---|---|---|---|
API类型 |
拉取、流式 |
推送、流式 |
内存树 |
XSLT规则 |
使用简便性 |
高 |
中等 |
高 |
中等 |
XPath功能 |
无 |
无 |
是 |
是 |
CPU和内存效率 |
良好 |
良好 |
各不相同 |
各不相同 |
仅向前 |
是 |
是 |
否 |
否 |
读取XML |
是 |
是 |
是 |
是 |
写入XML |
是 |
否 |
是 |
是 |
创建、读取、更新、删除 |
否 |
否 |
是 |
否 |