AXIOM 和 StAX
了解这些背景之后,现在看看 AXIO 的 StAX API。该 API 中最重要的方法如下:
(OMElement).getXMLStreamReader();
(OMElement).getXMLStreamReaderWithoutCaching();
通过 StAX API 对某个元素调用第一个方法,可以访问该元素的 XML Infoset,同时缓冲(如果需要)树中未构造的部分以供将来使用。顾名思义,第二个方法用于访问同样的信息,但是通过关闭缓冲机制优化了性能。在编写需要使用数据绑定框架的存根和 skeleton 程序时,这是最有用的方法。
但是请注意,如果在调用上述方法之前已经建立了树,AXIOM 将模拟 StAX 解析器。因此有些树节点的事件是通过模拟而来的,而对于另一些节点则直接连接到底层的解析器。AXIOM 的优点在于这些内部处理对用户是透明的。但是,在切换到原始 API 时,必须指明是否需要缓冲数据。
为了说明 StAX API 的用法,我将展示如何使用 XMLBeans 生成的代码连接到 AXIOM。
清单 5.XMLBeans 生成的订单代码
public class PurchaseOrderSkel {
public void submitPurchaseOrder(
PurchaseOrderDocument doc) throws Exception {
}
public void submitPurchaseOrderWrapper(
OMElement payload) {
try {
XMLStreamReader reader= payload.
getXMLStreamReaderWithoutCaching();
PurchaseOrderDocument doc
= PurchaseOrderDocument.Factory.parse(reader);
submitPurchaseOrder(doc);
} catch (Exception ex) {
ex.printStacktrace();
}
}
}
清单 5 中的代码(通常用代码生成工具生成)展示了一个 skeleton,它使用 XMLBeans 生成的类(即 PurchaseOrderDocument)进行数据绑定。这个 skeleton 包含两个服务实现方法。第一个允许服务实现者使用数据绑定对象,第二个则允许直接访问 AXIOM API。主要看看这几行:
XMLStreamReader reader= payload.
getXMLStreamReaderWithoutCaching();
PurchaseOrderDocument doc
= PurchaseOrderDocument.Factory.parse(reader);
为了创建对象,首先对 SOAP 栈(如 Apache Axis)压入服务实现的载荷获得对 StAX API 的引用。因为现在在处理链的最末端,所以可以安全地把解析器直接连接到 XMLBeans 解除封送器以获得最佳性能。
