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方式解析
依賴jar包:
1
2
3
4
5
|
< dependency > < groupId >dom4j</ groupId > < artifactId >dom4j</ artifactId > < version >1.6.1</ version > </ dependency > |
xml報(bào)文如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
<? 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ì)象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
/** * 解析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; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
/** * 解析對(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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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)的名稱 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è)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/xuri24/article/details/83113340