java解析xml報文的方式

程序員在使用java編程時,經常會遇到要求返回參數需要傳xml格式報文的情況,但是有些網上解析sml報文的方法寫得都很復雜,下面小編給大家介紹幾種簡單的java解析xml報文的方式。

方法一:文章源自四五設計網-http://www.wasochina.com/33237.html

1、第一種方式很簡單,但是有缺陷,我先說說怎么弄,待會再來說缺陷。首先在pom.xml中引入需要依賴的jar文件(maven項目直接依賴就行),如果不是maven管理的話自己手動去網上下載一下jar吧,也沒什么!文章源自四五設計網-http://www.wasochina.com/33237.html

java解析xml報文的方式-1文章源自四五設計網-http://www.wasochina.com/33237.html

2、然后就是應用了,下圖是比較正常的xml報文格式,先把我的xml報文給你們看一下吧!文章源自四五設計網-http://www.wasochina.com/33237.html

java解析xml報文的方式-2文章源自四五設計網-http://www.wasochina.com/33237.html

3、import net.sf.json.xml.XMLSerializer;引入后文章源自四五設計網-http://www.wasochina.com/33237.html

通過JSON respJson=new XMLSerializer().read(responseXml);方法文章源自四五設計網-http://www.wasochina.com/33237.html

把webservice那邊傳過來的xml報文(responseXml)解析成JSON。文章源自四五設計網-http://www.wasochina.com/33237.html

然后JSONObject jsonObject=JSONObject.fromObject(respJson);文章源自四五設計網-http://www.wasochina.com/33237.html

轉成json對象我們就能通過相應的節點一步一步去拿到里面的值了,如果是對json比較熟悉的同學的話用這種方式應該很好理解!文章源自四五設計網-http://www.wasochina.com/33237.html

java解析xml報文的方式-3

4、但是!!!這種方式如果是碰到比較奇葩一點的xml報文的話就比較尷尬了,比如下圖這種,就非得多添加幾個節點!然后你用XMLSerializer()去解析的時候就會發現程序并沒有那么智能,它分不清你是一個list還是一個單節點,這個時候你就得手動去處理了,沒有什么好的方式。

還有一點得特別注意:就是我們自己手動寫了一個xml報文去做測試和你調用別人接口然后解析出來的結果是不一樣的,這個也是一個比較奇葩的地方,如果有條件的話最好還是通過請求webservice接口拿到xml報文然后再去解析,別自己去寫一個靜態的xml報文然后解析。

java解析xml報文的方式-4

方法二:xstream方式

1、第二種方式稍稍復雜一點但是比較保險,javaBean與XML雙向轉換(推薦)。還是先引用jar包。

java解析xml報文的方式-5

2、拿到返回的xml報文,先分析一下xml的結構--data標簽嵌套head和body;此時我們得建相應的實體類了。

java解析xml報文的方式-6

java解析xml報文的方式-7

java解析xml報文的方式-8

3、body里面嵌套nbdetail標簽,而body里很明顯是一個list,此時我們得在body實體類中

XStreamImplicit(itemFieldName="nbdetail")

private List nbdetail;

XStreamImplicit(itemFieldName="nbdetail")這句話是關鍵,它會讓nbdetail認為是body的子標簽并且是list形式的;itemFieldName的值就是子標簽的名字,對應xml報文節點,然后實現get set方法。

java解析xml報文的方式-9

4、接下來就是把nbdetail標簽下的內容表現出來了; XStreamAlias("nbdetail")這句不能少,body下的nbdetail會通過這個找到你對應的實體類,然后關聯起來!

java解析xml報文的方式-10

5、ok,xml報文里的節點和我們的實體類都對應上了之后我們開始解析。直接上圖貼代碼了;

//responseXml是返回的xml字符串

String responseXml=contractservice.getWaitDealQueryAPpservice(mProcessParamDTO);

//import com.thoUGhtworks.xstream.XStream;別new錯了哦

XStream xs=new XStream();

//xml節點對應實體類

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});

//通過這種方式把xml轉成對象

Object obj=xs.fromXML(responseXml);

//強轉成Data對象

Data data=(Data)obj;

//對象的get方法不就拿到了對應節點的值了嗎?so easy

List nbdetail=data.getBody().getNbdetail();

java解析xml報文的方式-11

6、有的時候如果xml里面有Java的關鍵字的話,我們就不知道怎么建實體類了,我就碰到過。下面再說一下。先貼出xml報文吧!!

java解析xml報文的方式-12

7、body里面嵌套一個return標簽;嘿嘿,return是Java的關鍵字吧?閑話不多說,直接上圖解釋一下。

XStreamAlias("return")

private CLIsCustomerReturn cliscustomerreturn;

XStreamAlias("return")寫這句話時我們得import com.thoughtworks.xstream.annotations.XStreamAlias;記得寫get set方法

接下來就是建CLIsCustomerReturn實體類了,看圖您就明白過來了,我們不能直接寫return字段和實體類,所以我們得繞一下,雙向引用。

java解析xml報文的方式-13

java解析xml報文的方式-14

 

8、然后就是解析xml報文了,如下圖;和上面第5步是一樣的,同學們看一下就明白了,在此就不多做解釋了!

java解析xml報文的方式-15

以上就是java解析xml報文的方式,這些基本的知識對大家在學習java或者工作時具有一定的參考價值,大家可以選擇其中一種進行操作練習。

繼續閱讀
我的微信
微信掃一掃
weinxin
我的微信
惠生活福利社
微信掃一掃
weinxin
我的公眾號
 
  • 本文由 四五設計網小助手 發表于 2023年10月9日08:41:21
  • 轉載請務必保留本文鏈接:http://www.wasochina.com/33237.html

發表評論

匿名網友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖動滑塊以完成驗證