Dom4j如何解析xml复杂多节点报文
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍了Dom4j如何解析xml复杂多节点报文,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Dom4j解析xml复杂多节点报
千家信息网最后更新 2026年11月04日Dom4j如何解析xml复杂多节点报文
这篇文章主要介绍了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 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向下取数据
感谢你能够认真阅读完这篇文章,希望小编分享的"Dom4j如何解析xml复杂多节点报文"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
节点
对象
报文
文件
方式
方法
篇文章
复杂
平台
数据
不同
基础
语言
代码
价值
兴趣
只不过
同时
名称
多层
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
蓝思科技飞鸽互联网
互联网电商科技
互联网金融 金融科技
喔噻互联网科技
成都互联网科技公司
互联网科技美容
甘肃拓世互联网科技有限公司
互联网巨头投资的硬核科技
互联网和高科技公司
成都玖崟互联网科技有限公司乐商圈怎么样
互联网系的金融科技公司
互联网科技与管理
畅思互联网科技
特约风豹互联网科技为什么扣费
张召忠谈中国互联网科技
云鲸互联网络科技有限公司
互联网金融运营模式中的金融科技
互联网科技的前景
互联网科技创新方面的资料
恒生科技互联网指数十大成分股
江苏根荣互联网科技
中国互联网科技发展
紫鲸互联网科技
九亚互联网科技
友谊互联网络科技
一五八零互联网科技
江苏南京365互联网科技
郑州欣桑互联网科技有限公司
世界互联网科技成果奖
北京军民互联网科技公司