本教程适用于JDK 8。本页中描述的示例和实践不利用后续版本中引入的改进,可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的概述,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发行说明。
应用程序服务器9.1包含Sun Microsystems的JSR 173(StAX)实现,称为Sun Java流式XML解析器(简称为流式XML解析器)。流式XML解析器是一个基于Xerces2代码库构建的高速、非验证、W3C XML 1.0和Namespace 1.0兼容的流式XML拉取解析器。
在Sun的流式XML解析器实现中,Xerces2的底层,特别是Scanner和相关类,已经被重新设计为按拉取方式运行。除了底层的变化之外,流式XML解析器还包括额外的与StAX相关的功能和许多性能增强的改进。流式XML解析器实现在appserv-ws.jar和javaee.jar文件中,这两个文件位于install_dir/lib/目录中。
JAXP参考实现中附带了StAX代码示例,位于INSTALL_DIR/jaxp-version/samples/stax目录中,展示了Sun的流式XML解析器实现的工作原理。这些示例在示例代码中有描述。
在继续使用示例代码之前,有两个流式XML解析器的方面需要您注意:
下面将讨论这些主题。
流式XML解析器中实现的javax.xml.stream.XMLStreamReader不会报告CDATA事件。如果您的应用程序需要接收这些事件,请配置XMLInputFactory以设置以下特定于实现的report-cdata-event属性:
XMLInputFactory factory = XMLInptuFactory.newInstance(); factory.setProperty("report-cdata-event", Boolean.TRUE);
大多数应用程序不需要知道工厂实现类名。对于大多数应用程序来说,只需将javaee.jar和appserv-ws.jar文件添加到类路径中即可,因为这两个JAR文件在META-INF/services目录下提供了各种流式XML解析器属性的工厂实现类名,例如javax.xml.stream.XMLInputFactory、javax.xml.stream.XMLOutputFactory和javax.xml.stream.XMLEventFactory,这是应用程序在请求工厂实例时执行的查找操作的第三个步骤。有关查找机制的更多信息,请参阅XMLInputFactory.newInstance方法的Javadoc。
然而,可能存在一些场景,应用程序希望知道工厂实现类的名称并显式设置属性。这些场景可能包括在类路径中存在多个JSR 173实现的情况下,应用程序想要选择一个,可能是性能更好的一个,包含了关键的错误修复等。
如果应用程序设置了SystemProperty,它是查找操作的第一步,因此获取工厂实例将比其他选项快;例如:
javax.xml.stream.XMLInputFactory --> com.sun.xml.stream.ZephyrParserFactory javax.xml.stream.XMLOutputFactory --> com.sun.xml.stream.ZephyrWriterFactor javax.xml.stream.XMLEventFactory --> com.sun.xml.stream.events.ZephyrEventFactory