若有疑问,可以联系我本人微信:Y1141100952

声明:本文章为原稿,转载必须说明 本文章地址,否则一旦发现,必追究法律责任

1:本文章显示通过 XML工具-XmlUtil工具实现解析soap报文的xml格式文档的解析,取出里面的数据,放到map的key-value的集合里面,在使用另外的一个工具类实现map映射成java的实体类。本人亲自做过是可以实现的。文档最后会附上soap.xml文档,以供参考。

2: XML工具-XmlUtil的使用说明:(网址:https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/XML%E5%B7%A5%E5%85%B7-XmlUtil)

pom.xml依赖如下:

<!--hutool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.15</version>
</dependency>

主要的方法是:XmlUtil.getElements(elements, null);

第一个参数是传入的节点,以得到elements下的所有节点

第二个参数是获取elements下的指定节点以得到数据。如果为null,那么会返回elements下的所有节点。

开始进行报文的解析:

1:首先获取根节点:使用如下的代码即可获取

import org.w3c.dom.Document;
import org.w3c.dom.Element;
//    解析报文得到根节点
Document document = XmlUtil.parseXml(xml); //xml参数为String类型的xml报文,如果是现成的xml文档,你们可以用文件流读取出来再转为String类型
Element root = XmlUtil.getRootElement(document); 2:得到根节点之后,我们再拿根节点调用前文说的主要方法
//根据root得到的根节点,调用下面的方法获得Header ,Body节点
List<Element> elementList1 = XmlUtil.getElements(root, null); 3:我们得到了 Header ,Body节点,但是我们不需要解析Header节点,只需要解析Body节点,故我们继续调用
//根据 elementList1.get(1)取出Body节点 ,获得其下节点:Response
List<Element> elementList2 = XmlUtil.getElements(elementList1.get(1), null);

4.。。。。。。因为soap xml文档解析结构跟你们的不一样,故我只列出我做的,反正不断的调用 方法即可获取指定节点下的所有元素,一步一步的调用:

   XmlUtil.getElements(element, null);

我的完整代码如下:

//    解析报文
Document document = XmlUtil.parseXml(xml);
Element root = XmlUtil.getRootElement(document); //获得Header ,Body节点
List<Element> elementList1 = XmlUtil.getElements(root, null); //根据Body ,获得其下节点:Response
List<Element> elementList2 = XmlUtil.getElements(elementList1.get(1), null); //根据Response节点,又获取得到 ES_BASEINFO、ES_MESSAGE两个节点
List<Element> elementList3 = XmlUtil.getElements(elementList2.get(0), null); //根据ES_MESSAGE 节点,获取得到其下的 XM(项目)、FQ(分期)、LD(楼栋)、MJZB(面积指标)四个节点
List<Element> elementList4 = XmlUtil.getElements(elementList3.get(1), null);
//获取项目数据
elementList4.stream().forEach(xmElement -> {
//判断是否是项目的节点 ,常量SoapXmlConstant.XM是我自己定义的常量: XM
if (xmElement.getNodeName().equals(SoapXmlConstant.XM)) {
//获得XM所有子节点,可能包括:XM_MD0006、XM_MD0007、XM_MD0012、XM_MD0010
List<Element> xmNodeElement = XmlUtil.getElements(xmElement, null);
xmNodeElement.stream().forEach(xmChildNode -> {
//如果是子节点:XM_MD0006(因为其数据结构跟XM_MD0007、XM_MD0012、XM_MD0010节点不一样,故分离开)
if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0006)) {
List<Element> xm006DetailElements = XmlUtil.getElements(xmChildNode, null);
xm006DetailElements.stream().forEach(data -> {
xm0006.put(data.getNodeName(), data.getTextContent());
});
xm0006MapList.add(xm0006);
xmMap.put(SoapXmlConstant.XM_MD0006, xm0006MapList);
} else {
if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0007)) {
//XM_MD0007
List<Element> itemElements = XmlUtil.getElements(xmChildNode, null);
itemElements.stream().forEach(items -> {
Map<String, String> xm0007 = new HashMap<>(); //保存项目的XM_MD0007数据 key-value
List<Element> itemDetailElements = XmlUtil.getElements(items, null);
itemDetailElements.stream().forEach(data -> {
//获得了每个item下的子节点,遍历数据,保存数据
xm0007.put(data.getNodeName(), data.getTextContent());
});
xm0007MapList.add(xm0007);
});
xmMap.put(SoapXmlConstant.XM_MD0007, xm0007MapList);
} else if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0010)) {
//XM_MD0010
List<Element> itemElements = XmlUtil.getElements(xmChildNode, null);
itemElements.stream().forEach(items -> {
Map<String, String> xm0010 = new HashMap<>(); //保存项目的XM_MD0010数据 key-value
List<Element> itemDetailElements = XmlUtil.getElements(items, null);
itemDetailElements.stream().forEach(data -> {
//获得了每个item下的子节点,遍历数据,保存数据
xm0010.put(data.getNodeName(), data.getTextContent());
});
xm0010MapList.add(xm0010);
});
xmMap.put(SoapXmlConstant.XM_MD0010, xm0010MapList);
} else if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0021)) {
//XM_MD0021
List<Element> itemElements = XmlUtil.getElements(xmChildNode, null);
itemElements.stream().forEach(items -> {
Map<String, String> xm0021 = new HashMap<>(); //保存项目的XM_MD0012数据 key-value
List<Element> itemDetailElements = XmlUtil.getElements(items, null);
itemDetailElements.stream().forEach(data -> {
//获得了每个item下的子节点,遍历数据,保存数据
xm0021.put(data.getNodeName(), data.getTextContent());
});
xm0021MapList.add(xm0021);
});
xmMap.put(SoapXmlConstant.XM_MD0021, xm0023MapList);
} else if (xmChildNode.getNodeName().equals(SoapXmlConstant.XM_MD0023)) {
//XM_MD0023
List<Element> itemElements = XmlUtil.getElements(xmChildNode, null);
itemElements.stream().forEach(items -> {
Map<String, String> xm0023 = new HashMap<>(); //保存项目的XM_MD0012数据 key-value
List<Element> itemDetailElements = XmlUtil.getElements(items, null);
itemDetailElements.stream().forEach(data -> {
//获得了每个item下的子节点,遍历数据,保存数据
xm0023.put(data.getNodeName(), data.getTextContent());
});
xm0023MapList.add(xm0023);
});
xmMap.put(SoapXmlConstant.XM_MD0023, xm0023MapList);
} else {
//XM_MD0012
List<Element> itemElements = XmlUtil.getElements(xmChildNode, null);
itemElements.stream().forEach(items -> {
Map<String, String> xm0012 = new HashMap<>(); //保存项目的XM_MD0012数据 key-value
List<Element> itemDetailElements = XmlUtil.getElements(items, null);
itemDetailElements.stream().forEach(data -> {
//获得了每个item下的子节点,遍历数据,保存数据
xm0012.put(data.getNodeName(), data.getTextContent()); //key-value,保证后面的实体类映射map能映射数据
});
xm0012MapList.add(xm0012);
});
xmMap.put(SoapXmlConstant.XM_MD0012, xm0012MapList);
}
}
});
}
dataMap.put(SoapXmlConstant.XM, xmMap);
});

  

map集合映射成java实体类如下:(只有一个方法,调用即可)

pom.xml依赖如下:

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>

完整代码如下:(就这么简单:本人已经实现)

StagingMD0023 stagingMD0023 = new StagingMD0023();  //要映射map集合到的实体类
try {
BeanUtils.populate(stagingMD0023, fqMD0023);
//参数一:实体类,参数二:map集合
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

soap.xml文档百度云网盘如下:

链接:https://pan.baidu.com/s/1d1m3Aao8RTCXtE920ZBcZQ
提取码:tsi4

若有疑问,可以联系我本人微信:Y1141100952

xml文档的解析并通过工具类实现java实体类的映射:XML工具-XmlUtil的更多相关文章

  1. Java解析XML文档——dom解析xml

    一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object M ...

  2. DOM生成XML文档与解析XML文档(JUNIT测试)

    package cn.liuning.test; import java.io.File; import java.io.IOException; import javax.xml.parsers.D ...

  3. javaweb学习总结十三(dom4j方式对XML文档进行解析以及Xpath的使用)

    一:dom4j方式介绍 对于xml的解析总共有三种 1:jaxp方式,是sun公司开发的,分为sax方式和dom方式 2:jdom方式,后来其中部分人员参与开发dom4j 3:dom4j方式,是现在企 ...

  4. Java开发知识之XML文档使用,解析

    目录 XML文件详解 一丶XML简介 1.文档结构 2.XML中的元素(Element)或者叫做标签(Tab).属性 文本内容. 节点(Node) 3.XML语法规则 二丶XML文档解析 三丶使用XP ...

  5. QT XML文档的解析 QXmlStreamReader, DOM,SAX 三种解析方法 简单示例

    0. xml文档如下 <?xml version="1.0"?> <bookindex> <entry term="sidebearings ...

  6. XML文档的解析—dom4j

    XML为可扩展标记语言,它主要是用来保存数据,做配置文件,数据传输载体等.其实就是一个后缀名为.xml的文件. XML命名规则 名称可以含字母.数字以及其他的字符 名称不能以数字或者标点符号开始 名称 ...

  7. c# 创建XML文档,解析XML文档

    1.静态函数 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  8. web api .net C# mvc API返回XML文档的解析并取值

    [HttpGet] public System.Net.Http.HttpResponseMessage GetNotify() { var xmlstring = @" <xml&g ...

  9. XML反序列化出错,XML 文档(2, 2)中有错误

    XML转换为实体类的错误处理方案 一.错误描述: XML反序列化出错,XML 文档(2, 2)中有错误 二.解决方案: 在实体类的字段要加上XmlElement属性 三.具体实现: 1.XML文档 & ...

随机推荐

  1. 记一次上线部分docker不打日志的问题排查

    一次正常的上线,发了几台docker后,却发现有的机器打了info.log里面有日志,有的没有.排查问题开始: 第一:确认这台docker是否有流量进来,确认有流量进来. 第二:确认这台docker磁 ...

  2. ASP.NET CORE 2.* 利用集成测试框架覆盖HttpClient相关代码

    ASP.NET CORE 集成测试官方介绍 我的asp.net core 项目里面大部分功能都是去调用别人的API ,大量使用HttpClient,公司单元测试覆盖率要求95%以上,很难做到不mock ...

  3. 使用 php 内部web服务器

    使用 php 内部web服务器如网站目录 d:\web\index.php1.打开命令窗口,输入下列3条命令cd d:cd d:\web\index.phpphp -S localhost:80802 ...

  4. 【畅通工程 HDU - 1232 】【并查集模板】

    并查集讲解和模板 有一个博文对此分析的很透彻,附链接 为避免原链接失效,现摘录如下: 为了解释并查集的原理,我将举一个更有爱的例子. 话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业 ...

  5. 番茄日志发布1.0.3版本-增加Kafka支持

    番茄日志(TomatoLog)能做什么 可能你是第一次听说TomatoLog,没关系,我可以从头告诉你,通过了解番茄日志,希望能帮助有需要的朋友,番茄日志处理将大大降低你采集.分析.处理日志的过程. ...

  6. Windos 上逆天又好用的软件有哪些?

    谷歌浏览器 Chrome 浏览器是大名鼎鼎的科技公司谷歌开发的一款浏览器,国内的360浏览器等大多都是基于谷歌开源出的浏览器内核,然后给他穿了一层360的衣服.至于性能和启动速度上来讲,我个人觉得Ch ...

  7. 常用Feed流架构实现

    业务中很多需求都会用到类似feed流的架构. 例如 微信朋友圈 微博 动态 1对N消息. 一般feed流的架构实现有下面几种. 假如现在的业务场景是微博,然后当前的数据情况是: 用户A关注了用户B和C ...

  8. Linux环境搭建 | VMware下共享文件夹的实现

    在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了.本文介绍了两种共享文件夹的实现机制:VM ...

  9. 集群、限流、缓存 BAT 大厂无非也就是这么做

    前言 前阵子有网友询问,如何优化网站?这个问题真的很大,跟他简单的聊了一下,随便说了几点,觉得有必要整理一篇文章出来,正好前阵子在做爬虫博客,于是把大体思路分享出来,与大家互通有无,共同进步. 优化 ...

  10. Ribbon实现客户端负载均衡

    什么是Ribbon? 客户端负载均衡组件. 前期准备: 搭建一个Eureka集群和一个注册服务 https://www.cnblogs.com/noneplus/p/11374883.html 创建服 ...