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;
? ? }
以上:有疑問或建議歡迎指出更正。感謝分享!
關注個人技術公眾號:nick_coding1024
不定期分享最新前沿技術框架和bat大廠常用技術等,加群不定期分享行業內大牛直播講課以及獲得內退一線互聯網公司機會。
---------------------CSDN技術博客
原文:https://blog.csdn.net/xuri24/article/details/83113340