Dom4j解析xml複雜多節點報文
阿新 • • 發佈:2018-11-01
XML是一種通用的資料交換格式,它的平臺無關性、語言無關性、系統無關性、給資料整合與互動帶來了極大的方便。XML在不同的語言環境中解析方式都是一樣的,只不過實現的語法不同而已。
XML的解析方式分為四種:
1、DOM解析;
2、SAX解析;
3、JDOM解析;
4、DOM4J解析。
其中前兩種屬於基礎方法,是官方提供的平臺無關的解析方式;後兩種屬於擴充套件方法,它們是在基礎的方法上擴展出來的,只適用於java平臺。
本文介紹的是DOM4J方式解析。依賴jar包:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
xml報文如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Root> <SttlCntNb>2</SttlCntNb> <DebitCntAmt>CNY0.00</DebitCntAmt> <CreditCntAmt>CNY4700.00</CreditCntAmt> <SttlList> <SttlInf> <SttlReptFlg>2018052500170139</SttlReptFlg> <SttlDCFlg>2</SttlDCFlg> <SttlAmt>CNY100.00</SttlAmt> <BatchList> <BatchInf> <BatchId>B201805230015</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY100.00</BatchNetAmt> <SubItemList> <SubItemInf>0113|C3228644000018|04|CNY0.00|0|CNY5.00|1|</SubItemInf> <SubItemInf>0120|C3228640000020|05|CNY50.00|1|CNY0.00|0|</SubItemInf> <SubItemInf>0114|C3228640000029|07|CNY0.00|0|CNY5.00|1|</SubItemInf> <SubItemInf>0115|C3228640000019|06|CNY0.00|0|CNY5.00|1|</SubItemInf> <SubItemInf>0111|C3228640000016|03|CNY0.00|0|CNY10.00|1|</SubItemInf> <SubItemInf>0110|C3228644000016|01|CNY0.00|0|CNY110.00|1|</SubItemInf> <SubItemInf>0112|C3228644000017|99|CNY0.00|0|CNY5.00|1|</SubItemInf> <SubItemInf>0110|C3228644000016|02|CNY0.00|0|CNY10.00|1|</SubItemInf> </SubItemList> </BatchInf> </BatchList> </SttlInf> <SttlInf> <SttlReptFlg>2018052500170138</SttlReptFlg> <SttlDCFlg>2</SttlDCFlg> <SttlAmt>CNY4600.00</SttlAmt> <BatchList> <BatchInf> <BatchId>B201805240001</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY400.00</BatchNetAmt> <SubItemList> <SubItemInf>0126|C1010511003703|00|CNY0.00|4|CNY0.00|0|</SubItemInf> <SubItemInf>0125|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf> <SubItemInf>0126|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf> <SubItemInf>0124|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf> <SubItemInf>0123|C1010211000012|01|CNY0.00|4|CNY0.00|0|</SubItemInf> <SubItemInf>0110|C1010211000012|01|CNY0.00|0|CNY400.00|2|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240002</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY400.00</BatchNetAmt> <SubItemList> <SubItemInf>0125|C1010211000012|00|CNY400.00|4|CNY0.00|0|</SubItemInf> <SubItemInf>0110|C1010211000012|00|CNY0.00|0|CNY800.00|2|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240003</BatchId> <BatchDCFlg>1</BatchDCFlg> <BatchNetAmt>CNY0.00</BatchNetAmt> <SubItemList> <SubItemInf>0120|C1010211000012|00|CNY0.00|4|CNY0.00|0|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240004</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY1200.00</BatchNetAmt> <SubItemList> <SubItemInf>0112|C1010211000012|01|CNY0.00|0|CNY1200.00|2|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240005</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY400.00</BatchNetAmt> <SubItemList> <SubItemInf>0113|C1010211000012|00|CNY0.00|0|CNY400.00|4|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240006</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY400.00</BatchNetAmt> <SubItemList> <SubItemInf>0114|C1010211000012|00|CNY0.00|0|CNY400.00|4|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240007</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY200.00</BatchNetAmt> <SubItemList> <SubItemInf>0115|C1010211000012|01|CNY0.00|0|CNY200.00|2|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240008</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY600.00</BatchNetAmt> <SubItemList> <SubItemInf>0115|C1010211000012|01|CNY0.00|0|CNY600.00|2|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240009</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY400.00</BatchNetAmt> <SubItemList> <SubItemInf>0110|C1010511003703|00|CNY0.00|0|CNY400.00|2|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240010</BatchId> <BatchDCFlg>2</BatchDCFlg> <BatchNetAmt>CNY1200.00</BatchNetAmt> <SubItemList> <SubItemInf>0111|C1010211000012|01|CNY0.00|0|CNY1200.00|4|</SubItemInf> </SubItemList> </BatchInf> <BatchInf> <BatchId>B201805240012</BatchId> <BatchDCFlg>1</BatchDCFlg> <BatchNetAmt>CNY1200.00</BatchNetAmt> <SubItemList> <SubItemInf>0116|C1010511003703|00|CNY1200.00|4|CNY0.00|0|</SubItemInf> </SubItemList> </BatchInf> </BatchList> </SttlInf> </SttlList> </Root>
主要核心程式碼如下:
String saveFile 為本地儲存xml報文的路徑。
AccountInfoEntityResp 為解析xml後封裝的obj實體物件。
/** * 解析xml檔案並 */ public String Dom4jGetXML(String saveFile){ //返回的Entity物件 String xmlContents = new String(); // 建立SAXReader的物件reader SAXReader reader = new SAXReader(); try { // Resource resource = new ClassPathResource("accountInfo/"+accountDate+".xml"); Resource resource = new ClassPathResource(saveFile); File file = null; try{ file = resource.getFile(); }catch (Exception e){ //丟擲異常 } // 通過reader物件的read方法載入books.xml檔案,獲取docuemnt物件。 Document document = reader.read(file); // 通過document物件獲取根節點bookstore Element rootElement = document.getRootElement(); //document轉換為String字串 xmlContents = document.asXML(); //解析xml檔案並轉換為obj } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } return xmlContents; }
/**
* 解析對賬檔案xml,轉換為obj物件返回前段
* @Descriptions: 迴圈遍歷所有子節點,儲存每個節點的值
* @Return: AccountInfoEntity
*/
public AccountInfoEntityResp getNodes(Element node){
AccountInfoEntityResp accountInfoEntityResp = new AccountInfoEntityResp();
List<SttlInf> SttlList = new ArrayList<SttlInf>();
//獲得指定節點下面的子節點,首先要知道自己要操作的節點。
Element SttlCntNbElem = node.element("SttlCntNb");
//獲取SttlCntNb
String SttlCntNb = SttlCntNbElem.getTextTrim();
//獲取DebitCntAmt
Element DebitCntAmtElem = node.element("DebitCntAmt");
String DebitCntAmt = DebitCntAmtElem.getTextTrim();
//獲取CreditCntAmt
Element CreditCntAmtElem = node.element("CreditCntAmt");
String CreditCntAmt = CreditCntAmtElem.getTextTrim();
accountInfoEntityResp.setSttlCntNb(Integer.valueOf(SttlCntNb));
BigDecimal CreditCntAmtVal = null;
if(CreditCntAmt != null && !CreditCntAmt.isEmpty()){
CreditCntAmtVal = new BigDecimal(CreditCntAmt.replace("CNY", ""));
}
accountInfoEntityResp.setCreditCntAmt(CreditCntAmtVal);
BigDecimal DebitCntAmtval = null;
if(DebitCntAmt != null && !DebitCntAmt.isEmpty()){
DebitCntAmtval = new BigDecimal(DebitCntAmt.replace("CNY", ""));
}
accountInfoEntityResp.setDebitCntAmt(DebitCntAmtval);
//獲取SttlList
Element SttlListEle = node.element("SttlList");
//獲取SttlInf
Element SttlInfEle = SttlListEle.element("SttlInf");
List<Element> SttlInfList = SttlListEle.elements();
//遍歷SttlInfList節點
String SttlReptFlg = "";
Integer SttlDCFlg = null;
BigDecimal SttlAmt = null;
for(Element e : SttlInfList){
List<BatchInf> BatchList = new ArrayList<BatchInf>();
SttlInf sttlInf = new SttlInf();
//SttlInf下的子節點
Element SttlReptFlgEle = e.element("SttlReptFlg");
SttlReptFlg = SttlReptFlgEle.getTextTrim();
Element SttlDCFlgEle = e.element("SttlDCFlg");
SttlDCFlg = Integer.valueOf(SttlDCFlgEle.getTextTrim());
Element SttlAmtEle = e.element("SttlAmt");
SttlAmt = new BigDecimal(SttlAmtEle.getTextTrim().replace("CNY", ""));
//設值
sttlInf.setSttlAmt(SttlAmt);
sttlInf.setSttlDCFlg(SttlDCFlg);
sttlInf.setSttlReptFlg(SttlReptFlg);
//獲取BatchList節點
Element BatchListEle = e.element("BatchList");
//獲取BatchInf
List<Element> BatchInfList = BatchListEle.elements();
for(Element e2 : BatchInfList){
List<SubItemInf> SubItemList = new ArrayList<SubItemInf>();
BatchInf batchInf = new BatchInf();
String BatchId = "";
Integer BatchDCFlg = null;
BigDecimal BatchNetAmt = null;
Element BatchIdEle = e2.element("BatchId");
BatchId = BatchIdEle.getTextTrim();
Element BatchDCFlgEle = e2.element("BatchDCFlg");
BatchDCFlg = Integer.valueOf(BatchDCFlgEle.getTextTrim());
Element BatchNetAmtEle = e2.element("BatchNetAmt");
BatchNetAmt = new BigDecimal(BatchNetAmtEle.getTextTrim().replace("CNY", ""));
batchInf.setBatchDCFlg(BatchDCFlg);
batchInf.setBatchId(BatchId);
batchInf.setBatchNetAmt(BatchNetAmt);
//獲取SubItemList節點
Element SubItemListEle = e2.element("SubItemList");
//獲取BatchInf
List<Element> SubItemInfList = SubItemListEle.elements();
for(Element e3 : SubItemInfList){
SubItemInf subItemInf = new SubItemInf();
String subItem = "";
subItem = e3.getTextTrim().replace("CNY", "");
subItemInf.setSubItemInf(subItem);
SubItemList.add(subItemInf);
}
batchInf.setSubItemList(SubItemList);
BatchList.add(batchInf);
}
sttlInf.setBatchList(BatchList);
SttlList.add(sttlInf);
}
accountInfoEntityResp.setSttlList(SttlList);
return accountInfoEntityResp;
}
以上:有疑問或建議歡迎指出更正。感謝分享!