栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java】dom4j实现非常规XML字符串转java对象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java】dom4j实现非常规XML字符串转java对象

场景

常见的 XML 格式字符串数据转 Java对象的场景,一般是 XML 格式字符串数据中的标签名作为Java封装对象的属性名,最近工作中遇到一种格式比较特别的 XML 数据,属性名和属性值通过各自的XML标签定义,需要转换成json格式进行数据处理,本次处理通过java的 dom4j 工具处理,因为数据格式比较特别,特此记录一下,具体的数据格式如下。



  
    
      Queue
      PowName
      Isloadbackqueue
      VesselLCG
      20sprojections
      40sProjections
      Code
      IsActive
      Posloctype
      PosId
      YardName
      ActivationChanged
    
    
      
        HAJJ-load-01A
        
        false
        7285
        0
        0
        HAJJ01 02
        false
        Vessel
        HAJJ_267E
        WHA
        2022-03-15 09:16:57.784
      
      
        HAJJ-load-05A
        
        false
        5905
        0
        0
        HAJJ05 06
        false
        Vessel
        HAJJ_267E
        WHA
        2022-03-15 10:46:53.349
      
    
  

其中 标签中的 primary-key 属性是作为唯一标识的,需要提取整个 XML的解析如下。

解析

1)通过 maven 搭建的Java工程,引入 dom4j 的依赖。

        
            org.dom4j
            dom4j
            2.1.3
        
        
         
            org.nutz
            nutz
            1.r.67
        

2)根据 ... 标签中的字段对应封装Java接收类,每一个 标签的内容对应Java接收类中的一个属性,此外 标签中的 primary-key 属性在Java接收类中定义id字段接收,封装好的Java接收类如下。

import java.io.Serializable;


public class EntityDemo implements Serializable {

    private static final long serialVersionUID = 1L;
    
    private String id;
    private String queue;
    private String powName;
    private String isLoadBackQueue;
    private String vesselLcg;
    private String projections20;
    private String projections40;
    private String code;
    private String isActive;
    private String posLocType;
    private String posId;
    private String yardName;
    private String activationChanged ;

    // --------getter和setter方法省略------
}

3)对应的解析转化 XML 的方法如下:

 protected static List xml2Entity(String xml) throws documentException {
        xml = xml.replaceAll("n", "");
        List columnList = new ArrayList<>();
        List entityList = new ArrayList<>();
        SAXReader reader = new SAXReader(false);
        InputSource source = new InputSource(new ByteArrayInputStream(xml.getBytes()));
        source.setEncoding("utf-8");
        document document = reader.read(source);
        // query-response 是 根元素
        Element elQueryResponse = document.getRootElement();
        // 获取 query-response的下级标签 data-table 的属性,注意判断null
        Element elDataTable = elQueryResponse.element("data-table");
        if (null != elDataTable) {
            Element elColumns = elDataTable.element("columns");
            // 列名 key-value中的key
            List elColumnList = elColumns.elements();
            for (Element elColumn : elColumnList) {
                columnList.add(elColumn.getText().trim());
            }
            System.out.println("QueryCrane 返回结果列---:" + Json.toJson(columnList, JsonFormat.tidy()));
            // key-value中的 value elRows可能是空对象,单不为null
            Element elRows = elDataTable.element("rows");
            // elRowList可能是空列表
            List elRowList = elRows.elements();
            entityList = entityListMapping(elRowList);
            System.out.println("entityList---:" + Json.toJson(entityList, JsonFormat.tidy()));
        } else {
            // elDataTable 为 null
        }
        return entityList;
    }
    protected static List entityListMapping(List elRowList) {


        List entityList = new ArrayList<>();
        for (Element row : elRowList) {
            NavisCrane crane = new NavisCrane();
            Attribute primaryKey = row.attribute("primary-key");
            crane.setId(primaryKey.getValue());

            List elFieldList = row.elements();
            crane.setQueue(elFieldList.get(0).getText().trim());
            crane.setPowName(elFieldList.get(1).getText().trim());
            crane.setIsLoadBackQueue(elFieldList.get(2).getText().trim());
            crane.setVesselLcg(elFieldList.get(3).getText().trim());
            crane.setProjections20(elFieldList.get(4).getText().trim());
            crane.setProjections40(elFieldList.get(5).getText().trim());
            crane.setCode(elFieldList.get(6).getText().trim());
            crane.setIsActive(elFieldList.get(7).getText().trim());
            crane.setPosLocType(elFieldList.get(8).getText().trim());
            crane.setPosId(elFieldList.get(9).getText().trim());
            crane.setYardName(elFieldList.get(10).getText().trim());
            crane.setActivationChanged(elFieldList.get(11).getText().trim());
            entityList.add(crane);
        }

        return entityList;
    }

4)调用 xml2Entity(String xml) 方法,传入 上述格式的 XML 数据,解析获得的Java接受类 EntityDemo.class 的列表,json答应列表如下。

[
    {
        "id": "3076169",
        "queue": "HAJJ-load-01A",
        "powName": "",
        "isLoadBackQueue": "false",
        "vesselLcg": "7285",
        "projections20": "0",
        "projections40": "0",
        "code": "HAJJ01 02",
        "isActive": "false",
        "posLocType": "Vessel",
        "posId": "HAJJ_267E",
        "yardName": "WHA",
        "activationChanged": "2022-03-15 09:16:57.784"
    },
    {
        "id": "3077446",
        "queue": "HAJJ-load-05A",
        "powName": "",
        "isLoadBackQueue": "false",
        "vesselLcg": "5905",
        "projections20": "0",
        "projections40": "0",
        "code": "HAJJ05 06",
        "isActive": "false",
        "posLocType": "Vessel",
        "posId": "HAJJ_267E",
        "yardName": "WHA",
        "activationChanged": "2022-03-15 10:46:53.349"
    }
]
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778211.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号