- A+
程序員在使用java編程時(shí),經(jīng)常會(huì)遇到要求返回參數(shù)需要傳xml格式報(bào)文的情況,但是有些網(wǎng)上解析sml報(bào)文的方法寫(xiě)得都很復(fù)雜,下面小編給大家介紹幾種簡(jiǎn)單的java解析xml報(bào)文的方式。
方法一:
1、第一種方式很簡(jiǎn)單,但是有缺陷,我先說(shuō)說(shuō)怎么弄,待會(huì)再來(lái)說(shuō)缺陷。首先在pom.xml中引入需要依賴的jar文件(maven項(xiàng)目直接依賴就行),如果不是maven管理的話自己手動(dòng)去網(wǎng)上下載一下jar吧,也沒(méi)什么!
2、然后就是應(yīng)用了,下圖是比較正常的xml報(bào)文格式,先把我的xml報(bào)文給你們看一下吧!
3、import net.sf.json.xml.XMLSerializer;引入后
通過(guò)JSON respJson=new XMLSerializer().read(responseXml);方法
把webservice那邊傳過(guò)來(lái)的xml報(bào)文(responseXml)解析成JSON。
然后JSONObject jsonObject=JSONObject.fromObject(respJson);
轉(zhuǎn)成json對(duì)象我們就能通過(guò)相應(yīng)的節(jié)點(diǎn)一步一步去拿到里面的值了,如果是對(duì)json比較熟悉的同學(xué)的話用這種方式應(yīng)該很好理解!
4、但是!!!這種方式如果是碰到比較奇葩一點(diǎn)的xml報(bào)文的話就比較尷尬了,比如下圖這種,就非得多添加幾個(gè)節(jié)點(diǎn)!然后你用XMLSerializer()去解析的時(shí)候就會(huì)發(fā)現(xiàn)程序并沒(méi)有那么智能,它分不清你是一個(gè)list還是一個(gè)單節(jié)點(diǎn),這個(gè)時(shí)候你就得手動(dòng)去處理了,沒(méi)有什么好的方式。
還有一點(diǎn)得特別注意:就是我們自己手動(dòng)寫(xiě)了一個(gè)xml報(bào)文去做測(cè)試和你調(diào)用別人接口然后解析出來(lái)的結(jié)果是不一樣的,這個(gè)也是一個(gè)比較奇葩的地方,如果有條件的話最好還是通過(guò)請(qǐng)求webservice接口拿到xml報(bào)文然后再去解析,別自己去寫(xiě)一個(gè)靜態(tài)的xml報(bào)文然后解析。
方法二:xstream方式
1、第二種方式稍稍復(fù)雜一點(diǎn)但是比較保險(xiǎn),javaBean與XML雙向轉(zhuǎn)換(推薦)。還是先引用jar包。
2、拿到返回的xml報(bào)文,先分析一下xml的結(jié)構(gòu)--data標(biāo)簽嵌套head和body;此時(shí)我們得建相應(yīng)的實(shí)體類了。
3、body里面嵌套nbdetail標(biāo)簽,而body里很明顯是一個(gè)list,此時(shí)我們得在body實(shí)體類中
XStreamImplicit(itemFieldName="nbdetail")
private List nbdetail;
XStreamImplicit(itemFieldName="nbdetail")這句話是關(guān)鍵,它會(huì)讓nbdetail認(rèn)為是body的子標(biāo)簽并且是list形式的;itemFieldName的值就是子標(biāo)簽的名字,對(duì)應(yīng)xml報(bào)文節(jié)點(diǎn),然后實(shí)現(xiàn)get set方法。
4、接下來(lái)就是把nbdetail標(biāo)簽下的內(nèi)容表現(xiàn)出來(lái)了; XStreamAlias("nbdetail")這句不能少,body下的nbdetail會(huì)通過(guò)這個(gè)找到你對(duì)應(yīng)的實(shí)體類,然后關(guān)聯(lián)起來(lái)!
5、ok,xml報(bào)文里的節(jié)點(diǎn)和我們的實(shí)體類都對(duì)應(yīng)上了之后我們開(kāi)始解析。直接上圖貼代碼了;
//responseXml是返回的xml字符串
String responseXml=contractservice.getWaitDealQueryAPPService(mProcessParamDTO);
//import com.thoughtworks.xstream.XStream;別new錯(cuò)了哦
XStream xs=new XStream();
//xml節(jié)點(diǎn)對(duì)應(yīng)實(shí)體類
xs.alias("data",Data.class);
xs.alias("head",Head.class);
xs.alias("body",Body.class);
xs.alias("nbdetail",NBnbdetail.class);
xs.processAnnotations(new Class[]{Data.class,Head.class,
Body.class,NBnbdetail.class});
//通過(guò)這種方式把xml轉(zhuǎn)成對(duì)象
Object obj=xs.fromXML(responseXml);
//強(qiáng)轉(zhuǎn)成Data對(duì)象
Data data=(Data)obj;
//對(duì)象的get方法不就拿到了對(duì)應(yīng)節(jié)點(diǎn)的值了嗎?so easy
List nbdetail=data.getBody().getNbdetail();
6、有的時(shí)候如果xml里面有Java的關(guān)鍵字的話,我們就不知道怎么建實(shí)體類了,我就碰到過(guò)。下面再說(shuō)一下。先貼出xml報(bào)文吧!!
7、body里面嵌套一個(gè)return標(biāo)簽;嘿嘿,return是Java的關(guān)鍵字吧?閑話不多說(shuō),直接上圖解釋一下。
XStreamAlias("return")
private CLIsCustomerReturn cliscustomerreturn;
XStreamAlias("return")寫(xiě)這句話時(shí)我們得import com.thoughtworks.xstream.annotations.XStreamAlias;記得寫(xiě)get set方法
接下來(lái)就是建CLIsCustomerReturn實(shí)體類了,看圖您就明白過(guò)來(lái)了,我們不能直接寫(xiě)return字段和實(shí)體類,所以我們得繞一下,雙向引用。
8、然后就是解析xml報(bào)文了,如下圖;和上面第5步是一樣的,同學(xué)們看一下就明白了,在此就不多做解釋了!
以上就是java解析xml報(bào)文的方式,這些基本的知識(shí)對(duì)大家在學(xué)習(xí)java或者工作時(shí)具有一定的參考價(jià)值,大家可以選擇其中一種進(jìn)行操作練習(xí)。