xml文檔的解析並通過工具類實現java實體類的映射:XML工具-XmlUtil


 

  若有疑問,可以聯系我本人微信:Y1141100952

  聲明:本文章為原稿,轉載必須說明 本文章地址,否則一旦發現,必追究法律責任

1:本文章顯示通過 XML工具-XmlUtil工具實現解析soap報文的xml格式文檔的解析,取出里面的數據,放到map的key-value的集合里面,在使用另外的一個工具類實現map映射成java的實體類。本人親自做過是可以實現的。文檔最后會附上soap.xml文檔,以供參考。

 

2: XML工具-XmlUtil的使用說明:(網址:https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/XML%E5%B7%A5%E5%85%B7-XmlUtil)

  pom.xml依賴如下:

   

<!--hutool工具類-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.15</version>
</dependency>

   主要的方法是:XmlUtil.getElements(elements, null);  

   第一個參數是傳入的節點,以得到elements下的所有節點

   第二個參數是獲取elements下的指定節點以得到數據。如果為null,那么會返回elements下的所有節點。

 

開始進行報文的解析:

   1:首先獲取根節點:使用如下的代碼即可獲取

import org.w3c.dom.Document;
import org.w3c.dom.Element;

//    解析報文得到根節點
Document document = XmlUtil.parseXml(xml); //xml參數為String類型的xml報文,如果是現成的xml文檔,你們可以用文件流讀取出來再轉為String類型
Element root = XmlUtil.getRootElement(document);

2:得到根節點之后,我們再拿根節點調用前文說的主要方法
//根據root得到的根節點,調用下面的方法獲得Header ,Body節點
List<Element> elementList1 = XmlUtil.getElements(root, null);

3:我們得到了 Header ,Body節點,但是我們不需要解析Header節點,只需要解析Body節點,故我們繼續調用
//根據 elementList1.get(1)取出Body節點 ,獲得其下節點:Response
List<Element> elementList2 = XmlUtil.getElements(elementList1.get(1), null);

  4.。。。。。。因為soap xml文檔解析結構跟你們的不一樣,故我只列出我做的,反正不斷的調用 方法即可獲取指定節點下的所有元素,一步一步的調用:

 XmlUtil.getElements(element, null);

我的完整代碼如下:

//    解析報文
Document document = XmlUtil.parseXml(xml);
Element root = XmlUtil.getRootElement(document);

//獲得Header ,Body節點
List<Element> elementList1 = XmlUtil.getElements(root, null);

//根據Body ,獲得其下節點:Response
List<Element> elementList2 = XmlUtil.getElements(elementList1.get(1), null);

//根據Response節點,又獲取得到 ES_BASEINFO、ES_MESSAGE兩個節點
List<Element> elementList3 = XmlUtil.getElements(elementList2.get(0), null);

//根據ES_MESSAGE 節點,獲取得到其下的 XM(項目)、FQ(分期)、LD(樓棟)、MJZB(面積指標)四個節點
List<Element> elementList4 = XmlUtil.getElements(elementList3.get(1), null);

//獲取項目數據 elementList4.stream().forEach(xmElement -> {
//判斷是否是項目的節點 ,常量SoapXmlConstant.XM是我自己定義的常量: XM if (xmElement.getNodeName().equals(SoapXmlConstant.XM)) { //獲得XM所有子節點,可能包括:XM_MD0006、XM_MD0007、XM_MD0012、XM_MD0010 List<Element> xmNodeElement = XmlUtil.getElements(xmElement, null); xmNodeElement.stream().forEach(xmChildNode -> { //如果是子節點:XM_MD0006(因為其數據結構跟XM_MD0007、XM_MD0012、XM_MD0010節點不一樣,故分離開) if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0006)) { List<Element> xm006DetailElements = XmlUtil.getElements(xmChildNode, null); xm006DetailElements.stream().forEach(data -> { xm0006.put(data.getNodeName(), data.getTextContent()); }); xm0006MapList.add(xm0006); xmMap.put(SoapXmlConstant.XM_MD0006, xm0006MapList); } else { if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0007)) { //XM_MD0007 List<Element> itemElements = XmlUtil.getElements(xmChildNode, null); itemElements.stream().forEach(items -> { Map<String, String> xm0007 = new HashMap<>(); //保存項目的XM_MD0007數據 key-value List<Element> itemDetailElements = XmlUtil.getElements(items, null); itemDetailElements.stream().forEach(data -> { //獲得了每個item下的子節點,遍歷數據,保存數據 xm0007.put(data.getNodeName(), data.getTextContent()); }); xm0007MapList.add(xm0007); }); xmMap.put(SoapXmlConstant.XM_MD0007, xm0007MapList); } else if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0010)) { //XM_MD0010 List<Element> itemElements = XmlUtil.getElements(xmChildNode, null); itemElements.stream().forEach(items -> { Map<String, String> xm0010 = new HashMap<>(); //保存項目的XM_MD0010數據 key-value List<Element> itemDetailElements = XmlUtil.getElements(items, null); itemDetailElements.stream().forEach(data -> { //獲得了每個item下的子節點,遍歷數據,保存數據 xm0010.put(data.getNodeName(), data.getTextContent()); }); xm0010MapList.add(xm0010); }); xmMap.put(SoapXmlConstant.XM_MD0010, xm0010MapList); } else if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0021)) { //XM_MD0021 List<Element> itemElements = XmlUtil.getElements(xmChildNode, null); itemElements.stream().forEach(items -> { Map<String, String> xm0021 = new HashMap<>(); //保存項目的XM_MD0012數據 key-value List<Element> itemDetailElements = XmlUtil.getElements(items, null); itemDetailElements.stream().forEach(data -> { //獲得了每個item下的子節點,遍歷數據,保存數據 xm0021.put(data.getNodeName(), data.getTextContent()); }); xm0021MapList.add(xm0021); }); xmMap.put(SoapXmlConstant.XM_MD0021, xm0023MapList); } else if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0023)) { //XM_MD0023 List<Element> itemElements = XmlUtil.getElements(xmChildNode, null); itemElements.stream().forEach(items -> { Map<String, String> xm0023 = new HashMap<>(); //保存項目的XM_MD0012數據 key-value List<Element> itemDetailElements = XmlUtil.getElements(items, null); itemDetailElements.stream().forEach(data -> { //獲得了每個item下的子節點,遍歷數據,保存數據 xm0023.put(data.getNodeName(), data.getTextContent()); }); xm0023MapList.add(xm0023); }); xmMap.put(SoapXmlConstant.XM_MD0023, xm0023MapList); } else { //XM_MD0012 List<Element> itemElements = XmlUtil.getElements(xmChildNode, null); itemElements.stream().forEach(items -> { Map<String, String> xm0012 = new HashMap<>(); //保存項目的XM_MD0012數據 key-value List<Element> itemDetailElements = XmlUtil.getElements(items, null); itemDetailElements.stream().forEach(data -> { //獲得了每個item下的子節點,遍歷數據,保存數據 xm0012.put(data.getNodeName(), data.getTextContent()); //key-value,保證后面的實體類映射map能映射數據 }); xm0012MapList.add(xm0012); }); xmMap.put(SoapXmlConstant.XM_MD0012, xm0012MapList); } } }); } dataMap.put(SoapXmlConstant.XM, xmMap); });

  

map集合映射成java實體類如下:(只有一個方法,調用即可)

    pom.xml依賴如下:

  

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>

完整代碼如下:(就這么簡單:本人已經實現)

StagingMD0023 stagingMD0023 = new StagingMD0023();  //要映射map集合到的實體類
try {
BeanUtils.populate(stagingMD0023, fqMD0023);
//參數一:實體類,參數二:map集合
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

 

soap.xml文檔百度雲網盤如下:

鏈接:https://pan.baidu.com/s/1d1m3Aao8RTCXtE920ZBcZQ
提取碼:tsi4

 

 

  若有疑問,可以聯系我本人微信:Y1141100952

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM