Dom4j解析xml复杂多节点报文方式

网友投稿 1365 2022-12-05

Dom4j解析xml复杂多节点报文方式

Dom4j解析xml复杂多节点报文方式

目录Dom4j解析xml复杂多节点报文XML的解析方式分为四种本文介绍的是DOM4J方式解析主要核心代码如下dom4j解析多层xml

Dom4j解析xml复杂多节点报文

XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。

XML的解析方式分为四种

1、DOM解析

2、SAX解析

3、JDOM解析

4、DOM4J解析

其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。

本文介绍的是DOM4J方式解析

依赖jar包:

dom4j

dom4j

1.6.1

xml报文如下:

2

CNY0.00

CNY4700.00

2018052500170139

2

CNY100.00

B201805230015

2

CNY100.00

0113|C3228644000018|04|CNY0.00|0|CNY5.00|1|

0120|C3228640000020|05|CNY50.00|1|CNY0.00|0|

0114|C3228640000029|07|CNY0.00|0|CNY5.00|1|

0115|C3228640000019|06|CNY0.00|0|CNY5.00|1|

0111|C3228640000016|03|CNY0.00|0|CNY10.00|1|

0110|C3228644000016|01|CNY0.00|0|CNY110.00|1|

0112|C3228644000017|99|CNY0.00|0|CNY5.00|1|

0110|C3228644000016|02|CNY0.00|0|CNY10.00|1|

2018052500170138</SttlReptFlg>

2

CNY4600.00

B201805240001

2

CNY400.00

0126|C1010511003703|00|CNY0.00|4|CNY0.00|0|

0125|C1010211000012|01|CNY0.00|8|CNY0.00|0|

0126|C1010211000012|01|CNY0.00|8|CNY0.00|0|

0124|C1010211000012|01|CNY0.00|8|CNY0.00|0|

0123|C1010211000012|01|CNY0.00|4|CNY0.00|0|

0110|C1010211000012|01|CNY0.00|0|CNY400.00|2|

B201805240002

2

CNY400.00

0125|C1010211000012|00|CNY400.00|4|CNY0.00|0|

0110|C1010211000012|00|CNY0.00|0|CNY800.00|2|

B201805240003

1

CNY0.00

0120|C1010211000012|00|CNY0.00|4|CNY0.00|0|

B201805240004

2

CNY1200.00

0112|C1010211000012|01|CNY0.00|0|CNY1200.00|2|

B201805240005

2

CNY400.00

0113|C1010211000012|00|CNY0.00|0|CNY400.00|4|

B201805240006

2

CNY400.00

0114|C1010211000012|00|CNY0.00|0|CNY400.00|4|

B201805240007

2

CNY200.00

0115|C1010211000012|01|CNY0.00|0|CNY200.00|2|

B201805240008

2

CNY600.00

0115|C1010211000012|01|CNY0.00|0|CNY600.00|2|

B201805240009

2

CNY400.00

0110|C1010511003703|00|CNY0.00|0|CNY400.00|2|

B201805240010

2

CNY1200.00

0111|C1010211000012|01|CNY0.00|0|CNY1200.00|4|

B201805240012

1

CNY1200.00

0116|C1010511003703|00|CNY1200.00|4|CNY0.00|0|

主要核心代码如下

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 SttlList = new ArrayList();

//获得指定节点下面的子节点,首先要知道自己要操作的节点。

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 SttlInfList = SttlListEle.elements();

//遍历SttlInfList节点

String SttlReptFlg = "";

Integer SttlDCFlg = null;

BigDecimal SttlAmt = null;

for(Element e : SttlInfList){

List BatchList = new ArrayList();

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 BatchInfList = BatchListEle.elements();

for(Element e2 : BatchInfList){

List SubItemList = new ArrayList();

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 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.创建Reader对象

SAXReader reader = new SAXReader();

String str = "\r\n"

+ " \r\n" + " hanke_tom\r\n"

+ " \r\n"

+ " tom\r\n"

+ " http://192.168.1.5:8080/sso/logout\r\n"

+ " false\r\n"

+ " 2019-11-26T17:47:55.789+08:00[Asia/Shanghai]\r\n"

+ " 01\r\n"

+ " TomAuthenticationHandler\r\n"

+ " TomAuthenticationHandler\r\n"

+ " 张三\r\n"

+ " false\r\n"

+ " 00001\r\n"

+ " hanke_tom\r\n" + " \r\n"

+ " \r\n" + "";

// 2.加载xml

Document document = DocumentHelper.parseText(str);

// 3.获取根节点

Element rootElement = document.getRootElement();

Iterator iterator = rootElement.elementIterator();

System.out.println("根节点:" + rootElement.getName()); // 拿到根节点的名称

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);

}

}

}

}

如果后面还有子级继续while向下取数据

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于Controller 层返回值的公共包装类的问题
下一篇:解决Maven项目本地公共common包缓存问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~