• xml文档的解析并通过工具类实现java实体类的映射:XML工具-XmlUtil


      若有疑问,可以联系我本人微信: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

  • 相关阅读:
    HttpCookie类
    WebClient类
    最大流算法 ISAP 模板 和 Dinic模板
    拓扑序+dp Codeforces Round #374 (Div. 2) C
    二分 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D
    线段树 或者 并查集 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C
    无源无汇有上下界的最大流
    并查集+bfs+暴力滑窗 Codeforces Round #356 (Div. 2) E
    dfs Codeforces Round #356 (Div. 2) D
    cookie+session
  • 原文地址:https://www.cnblogs.com/qq1141100952com/p/11156413.html
Copyright © 2020-2023  润新知