Dom4j解析xml復(fù)雜多節(jié)點(diǎn)報(bào)文方式
Dom4j解析xml復(fù)雜多節(jié)點(diǎn)報(bào)文
XML是一種通用的數(shù)據(jù)交換格式,它的平臺(tái)無(wú)關(guān)性、語(yǔ)言無(wú)關(guān)性、系統(tǒng)無(wú)關(guān)性、給數(shù)據(jù)集成與交互帶來(lái)了極大的方便。XML在不同的語(yǔ)言環(huán)境中解析方式都是一樣的,只不過(guò)實(shí)現(xiàn)的語(yǔ)法不同而已。
XML的解析方式分為四種
1、DOM解析
2、SAX解析
3、JDOM解析
4、DOM4J解析
其中前兩種屬于基礎(chǔ)方法,是官方提供的平臺(tái)無(wú)關(guān)的解析方式;后兩種屬于擴(kuò)展方法,它們是在基礎(chǔ)的方法上擴(kuò)展出來(lái)的,只適用于java平臺(tái)。
本文介紹的是DOM4J方式解析
依賴(lài)jar包:
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>
xml報(bào)文如下:
<?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報(bào)文的路徑。AccountInfoEntityResp為解析xml后封裝的obj實(shí)體對(duì)象。
/**
* 解析xml文件并
*/
public String Dom4jGetXML(String saveFile){
//返回的Entity對(duì)象
String xmlContents = new String();
// 創(chuàng)建SAXReader的對(duì)象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){
//拋出異常
}
// 通過(guò)reader對(duì)象的read方法加載books.xml文件,獲取docuemnt對(duì)象。
Document document = reader.read(file);
// 通過(guò)document對(duì)象獲取根節(jié)點(diǎn)bookstore
Element rootElement = document.getRootElement();
//document轉(zhuǎn)換為String字符串
xmlContents = document.asXML();
//解析xml文件并轉(zhuǎn)換為obj
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return xmlContents;
}
/**
* 解析對(duì)賬文件xml,轉(zhuǎn)換為obj對(duì)象返回前段
* @Descriptions: 循環(huán)遍歷所有子節(jié)點(diǎn),保存每個(gè)節(jié)點(diǎn)的值
* @Return: AccountInfoEntity
*/
public AccountInfoEntityResp getNodes(Element node){
AccountInfoEntityResp accountInfoEntityResp = new AccountInfoEntityResp();
List<SttlInf> SttlList = new ArrayList<SttlInf>();
//獲得指定節(jié)點(diǎn)下面的子節(jié)點(diǎn),首先要知道自己要操作的節(jié)點(diǎn)。
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節(jié)點(diǎn)
String SttlReptFlg = "";
Integer SttlDCFlg = null;
BigDecimal SttlAmt = null;
for(Element e : SttlInfList){
List<BatchInf> BatchList = new ArrayList<BatchInf>();
SttlInf sttlInf = new SttlInf();
//SttlInf下的子節(jié)點(diǎn)
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", ""));
//設(shè)值
sttlInf.setSttlAmt(SttlAmt);
sttlInf.setSttlDCFlg(SttlDCFlg);
sttlInf.setSttlReptFlg(SttlReptFlg);
//獲取BatchList節(jié)點(diǎn)
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節(jié)點(diǎn)
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;
}
dom4j解析多層xml
package com.bessky.hrmis.test;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4JDemo {
public static void main(String[] args) throws Exception {
// 1.創(chuàng)建Reader對(duì)象
SAXReader reader = new SAXReader();
String str = "<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>\r\n"
+ " <cas:authenticationSuccess>\r\n" + " <cas:user>hanke_tom</cas:user>\r\n"
+ " <cas:attributes>\r\n"
+ " <cas:credentialType>tom</cas:credentialType>\r\n"
+ " <cas:logout_url>http://192.168.1.5:8080/sso/logout</cas:logout_url>\r\n"
+ " <cas:isFromNewLogin>false</cas:isFromNewLogin>\r\n"
+ " <cas:authenticationDate>2019-11-26T17:47:55.789+08:00[Asia/Shanghai]</cas:authenticationDate>\r\n"
+ " <cas:user_id>01</cas:user_id>\r\n"
+ " <cas:authenticationMethod>TomAuthenticationHandler</cas:authenticationMethod>\r\n"
+ " <cas:successfulAuthenticationHandlers>TomAuthenticationHandler</cas:successfulAuthenticationHandlers>\r\n"
+ " <cas:name>張三</cas:name>\r\n"
+ " <cas:longTermAuthenticationRequestTokenUsed>false</cas:longTermAuthenticationRequestTokenUsed>\r\n"
+ " <cas:job_number>00001</cas:job_number>\r\n"
+ " <cas:username>hanke_tom</cas:username>\r\n" + " </cas:attributes>\r\n"
+ " </cas:authenticationSuccess>\r\n" + "</cas:serviceResponse>";
// 2.加載xml
Document document = DocumentHelper.parseText(str);
// 3.獲取根節(jié)點(diǎn)
Element rootElement = document.getRootElement();
Iterator iterator = rootElement.elementIterator();
System.out.println("根節(jié)點(diǎn):" + rootElement.getName()); // 拿到根節(jié)點(diǎn)的名稱(chēng)
Iterator bbbb = rootElement.elementIterator("authenticationSuccess");
while (bbbb.hasNext()) {
Element recordEless = (Element) bbbb.next();
Iterator cccc = recordEless.elementIterator("attributes");
while (cccc.hasNext()) {
Element itemEle = (Element) cccc.next();
String username = itemEle.elementTextTrim("job_number");
System.err.println("---------"+username);
}
}
}
}
如果后面還有子級(jí)繼續(xù)while向下取數(shù)據(jù)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中Arraylist動(dòng)態(tài)擴(kuò)容方法詳解
ArrayList的列表對(duì)象實(shí)質(zhì)上是存儲(chǔ)在一個(gè)引用型數(shù)組里的,下面這篇文章主要給大家介紹了關(guān)于Java中Arraylist動(dòng)態(tài)擴(kuò)容方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
關(guān)于SpringCloudStream配置問(wèn)題
這篇文章主要介紹了關(guān)于SpringCloudStream配置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
SpringBoot創(chuàng)建線程池的六種方式小結(jié)
本文主要介紹了SpringBoot創(chuàng)建線程池的六種方式小結(jié),包括自定義線程池,固定長(zhǎng)度線程池,單一線程池,共享線程池,定時(shí)線程池,SpringBoot中注入異步線程池,感興趣的可以了解一下2023-11-11
Java使用itextpdf實(shí)現(xiàn)生成PDF并添加圖片,水印和文字
這篇文章主要為大家詳細(xì)介紹了Java在使用itextpdf實(shí)現(xiàn)生成PDF時(shí)如何實(shí)現(xiàn)添加圖片,水印和文字等效果,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
淺談SpringBoot集成Quartz動(dòng)態(tài)定時(shí)任務(wù)
這篇文章主要介紹了SpringBoot集成Quartz動(dòng)態(tài)定時(shí)任務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
用Java實(shí)現(xiàn)春聯(lián)?支持自定義字體顏色
大家好,本篇文章主要講的是用Java編寫(xiě)春聯(lián)?支持自定義字體顏色,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01

