AXIs 對象模型 (AXIOM) 是一個 XML 對象模型,設計用於提升 XML 處理期間的內存使用率和性能,基於 Pull 解析。經過使用 Streaming API for XML (StAX) Pull 解析器,AXIOM(也稱爲 OM)能夠控制解析過程,以提供延遲構建支持。延遲構建是指 AXIOM 不徹底構建對象模型,模型的其他部分基於用戶的需求構建。如下示例對此概念進行了說明: 數組
假定某個用戶須要從 XML 輸入流中得到第一我的的 <Location> 元素值,AXIOM 構建的對象模型將一直包含到 <Location> 元素結束的內容,而讓其餘內容保留在流中: app
<Persons> <Person> <Name>Dihini Himahansi</Name> <Sex>Female</Sex> <Location>Colombo, Sri Lanka</Location> <--- Object model is being built only up to this point </Person> <Person> <Name>Thushari Damayanthi</Name> <Sex>Female</Sex> <Location>Elpitiya, Sri Lanka</Location> </Person> </Persons> |
這裏的優點在於,儘量僅使用能知足用戶的需求的內存。若是用戶但願訪問較大的文檔中前面的數個字節或數千字節,則延遲構建功能將改善該應用程序的內存需求狀況。 優化
能夠從任何元素得到 StAX 事件,而無論是否完整構建了對象模型。在有些狀況下,Axis 2 中的此功能很是有用。例如,當 Axis2 做爲中介傳遞時,若是須要僅讀取 SOAP 消息的 Header,AXIOM 將防止其讀取整個 SOAP 消息,使其具備很高的內存效率。另外一個例子是,當 Web 服務實現可以直接使用 StAX 事件時,因爲採用了 AXIOM,Web 服務所需的內存很是小。 ui
此外,AXIOM 內置了消息傳輸優化機制(Message Transfer Optimization Mechanism,MTOM)支持。對於 AXIOM 體系結構,能夠經過實現 AXIOM 接口並將其插入到 Axis2 中來執行本身的對象模型。 this
因爲 AXIOM 最初是做爲 Axis2 的對象模型而開發的,所以 AXIOM 提供了構建於基礎 AXIOM API 之上的 SOAP 接口。這容許您使用 envelope.getHeaders 和 envelope.getBody 之類的便利方法查看 SOAP。 spa
AXIS2會將Web Service方法中的參數或返回值中的自定義對象、數組、List等類型統一映射爲OMElement類型,這就咱們須要編寫OMElement與自定義類型質檢的轉換方法,下面給出幾個經常使用的方法: 設計
CASE1:自定義對象生成OMElement方法: code
Person man = new Person();
man.setName("Warlaze");
man.setAge(25);
man.setAddress("Bei jing");
man.setPhonenum("13900000000");
javax.xml.stream.XMLStreamReader reader = BeanUtil.getPullParser(man);
StreamWrapper parser = new StreamWrapper(reader);
StAXOMBuilder stAXOMBuilder =OMXMLBuilderFactory.createStAXOMBuilder(OMAbstractFactory.getOMFactory(), parser);
OMElement element = stAXOMBuilder.getDocumentElement();
CASE2:List或Array類型生成OMElement方法:
List<Person> list = new ArrayList<Person>();
list.add(man);
list.add(man);
OMElement omElement = BeanUtil.getOMElement(new QName("root"), list
.toArray(), new QName("person"), false, null);
CASE3:解析包含基本類型的List或Array生成的OMElement的方法:
private static List<String> getResults(OMElement element) {
if(element == null){
return null;
}
Iterator iterator = element.getChildElements();
List<String> list = new ArrayList<String>();
while (iterator.hasNext()) {
OMNode omNode = (OMNode) iterator.next();
if (omNode.getType() == OMNode.ELEMENT_NODE) {
OMElement omElement = (OMElement) omNode;
if (omElement.getLocalName().equals("string")) {
String temp = omElement.getText().trim();
System.out.println(temp);
list.add(temp);
}
}
}
return list;
}
CASE4:解析包含自定義Java類型的List或Array的方法:
private static List<Person> getResults(OMElement element) throws AxisFault { if (element == null) { return null; } Iterator iterator = element.getChildElements(); List<Person> list = new ArrayList<Person>(); while (iterator.hasNext()) { OMNode omNode = (OMNode) iterator.next(); if (omNode.getType() == OMNode.ELEMENT_NODE) { OMElement omElement = (OMElement) omNode; if (omElement.getLocalName().toLowerCase().equals("person")) { Person person = (Person) BeanUtil.processObject(omElement, Person.class, null, true, new DefaultObjectSupplier()); list.add(person); } } } return list; }