日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

AXIOM解析XML 详细原理

發(fā)布時間:2023/12/20 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AXIOM解析XML 详细原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:http://warlaze.blog.sohu.com/58477971.html

AXIOM

Axis對象模型(AXIOM)是一個XML對象模型,設(shè)計用于提高XML處理期間的內(nèi)存的使用率和性能,基于Pull解析。

Pull解析方式,基于STAX(Streaming API for XML),Pull解析是最近處理XML的一種趨勢,

? 而SAX和DOM都是基于push的解析方式,也就是說解析控制在parser本身。Push解析方式很容易使用,但在處理XML文檔時效率并不好,(因為要在內(nèi)存中生成完整的對象模型)。Pull解析方式顛倒了這種控制方式,增強了parser,只在用戶需要的時候才進行處理。用戶決定處理或者忽略parser生成的事件。

AXIOM(也稱為OM)可以控制解析過程,以提供延遲構(gòu)建支持。延遲構(gòu)建是 指AXIOM不完全構(gòu)建對象模型,模型的其余部分基于用戶的需要構(gòu)建。以下實例對此概念進行了說明:假定某個用戶需要從XML輸入流中獲得一個人 的<Location>元素值,AXIOM構(gòu)建的對象模型將一直包含到<Location>元素結(jié)束的內(nèi)容,而讓其他內(nèi)容保留在 流中:

清單 1.對象模型的AXIOM部分構(gòu)建

<Persons>
<Person>
<Name>DihInI Himahansi</Name>
<Sex>Femal</Sex>
<Location>Colomo,Sri LanKa</Location>
<--對象模型僅在此之上建立-->
</Person>
<Person>
<Name>DihInI Himahansi</Name>
<Sex>Femal</Sex>
<Location>Colomo,Sri LanKa</Location>
</Person>
</Persons>

這里的優(yōu)勢在于,盡可能僅使用能滿足用戶需求的內(nèi)存。如果用戶希望訪問較大的文檔中前面的數(shù)個字節(jié)或數(shù)千個字節(jié),則延遲構(gòu)建功能將改善應(yīng)用程序的內(nèi)存需求情況。

可以從任何元素獲得Stax事件,而不管是否完整構(gòu)建了對象模型。在有些情況 下,Axis2的此功能非常有用。例如,當Axis2作為中介傳遞時,如果僅需要讀取SOAP消息的Header,AXIOM將防止其讀取整個SOAP消 息,使其具有很高的內(nèi)存效率。另一個例子是,當Web服務(wù)實現(xiàn)能夠直接使用Stax事件時,由于采用了AXIOM,Web服務(wù)所需的內(nèi)存非常小。

此外,AXIOM內(nèi)置了消息傳輸優(yōu)化機制(Message Transfer Optimization Mechanism,MTOM)支持。對于AXIOM體系結(jié)構(gòu),可以通過實現(xiàn)AXIOM接口并將其插入到Axis2中來執(zhí)行自己的對象模型。

由于AXIOM最初是作為Axis2的對象模型而開發(fā)的,因此AXIOM提供了構(gòu)建于基礎(chǔ)AXIOM API之上的SOAP接口。這允許您使用envelop.getHeaders和envelope.getBody之類的便利方法查看SOAP。

AXIS2會將Web Service方法中的參數(shù)或返回值中的自定義對象、數(shù)組、List等類型統(tǒng)一映射為OMElement類型,這就是我們需要編寫OMElement于自定義類型之間的轉(zhuǎn)換方法,下面給出了幾個常用的方法:

CASE1:自定義對象生成OMElement方法:

Person man=new Person();
man.setName("Warlaze");
man.setAge(25);
man.setAddress("Bei jing");
man.setPhonenum("15900000000");
javax.xml.stream.XMLStreamReader reader=BeanUtil.getPullParser(man);
StreamWrapper parser=new StreamWrapper(reader);
StAXOMBuilder stAXOMBuilder=OMXMLBuilderFactory.createStAXOMBuilder(OMAbstractory.getOMFactory(), parser);
OMElement element=stAXOMBuilder.getDocumentElement();

CASE2:list或Array類型生成OMElement方法:

List<Person> list=new ArrayList<Person>();
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;
}
Iterrator 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(omElement.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);
}
}
}
}

http://www.blogjava.net/juleven/archive/2006/12/08/86458.html

Axiom讀XML:

// 首先構(gòu)建parser,
XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader(
new FileInputStream("5.xml"));
// 還需要builder對象,
StAXOMBuilder builder = new StAXOMBuilder(parser);
// get the root element
// OMElement documentElement = builder.getDocumentElement();
OMDocument doc = builder.getDocument();

OMElement cre = doc.getOMDocumentElement().getFirstChildWithName(new QName("fool"));

// OMElement有一系列的get方法來獲得內(nèi)容。

cre.serialize(System.out); // cache on
cre.serializeAndConsume(System.out); // cache off

// will NOT build the OMTree in the memory.
// So you are at your own risk of losing information.
String creStr = cre.toStringWithConsume();
// call toString, will build the OMTree in the memory.
System.out.println(cre);

Axiom寫XML:

// 可以構(gòu)建writer做輸出器,
XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(
new FileOutputStream("2.xml"));

// 通常通過OMFactory來構(gòu)造XML文檔中的element,下面是一些示例代碼。
OMFactory factory = OMAbstractFactory.getOMFactory();
OMDocument doc = factory.createOMDocument();
OMNamespace ns = factory.createOMNamespace("http://demo.axiom","x");
OMNamespace ns1 = factory.createOMNamespace("http://ot.demo.axiom","y");
OMElement root = factory.createOMElement("root",ns);
OMElement elt11 = factory.createOMElement("fool",ns1);
elt11.addChild(factory.createOMText("YY"));
OMElement ele = factory.createOMElement("ele", "http://namespace", "ns");
ele.addChild(factory.createOMText("ELE"));
root.addAttribute(factory.createOMAttribute("attr", ns, "test attr"));
root.addChild(elt11);
root.addChild(ele);
doc.addChild(root);
root.serialize(writer); // cache on
writer.flush();
doc.serializeAndConsume(new FileOutputStream("3.xml"));
OMOutputFormat oof = new OMOutputFormat();
doc.serializeAndConsume(new FileOutputStream("5.xml"), oof); //cache off //ele.detach();
ele.serialize(System.out); // 即使detach(),依然會輸出ele
doc.serialize(System.out); // 如果detach(),就不會有ele到document里。


關(guān)于serialize和serializeAndConsume,前者會強制構(gòu)建OMTree,或者則不會。
關(guān)于detach,它只影響OMElement本身和OMTree的關(guān)系,并不影響OMElement本身。
與之對應(yīng)的還有一個build方法,build會強制build整個OMTree出來。
這兩個方法通常用在處理OMElement與OMTree的關(guān)系上。從輸入流構(gòu)建出OMElement(build)以及把OMElement從輸入流斷開(detach),以便放到輸出流。輸入流和輸出流是不同的OMTree。


測試用的XML文檔(5.xml),

<?xml version='1.0' encoding='utf-8'?>
<x:root xmlns:x="http://demo.axiom" x:attr="test attr">
<y:fool xmlns:y="http://ot.demo.axiom">YY</y:fool>
<ns:ele xmlns:ns="http://namespace">ELE</ns:ele>
</x:root>

參考:
AXIOM Tutorial : http://ws.apache.org/commons/axiom/OMTutorial.html

轉(zhuǎn)載于:https://www.cnblogs.com/antis/p/5226924.html

總結(jié)

以上是生活随笔為你收集整理的AXIOM解析XML 详细原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。