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

场景

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

<?xml version="1.0" encoding="UTF-8"?>
<query-response>
  <data-table filter="CRANE_FILTER" count="2">
    <columns>
      <column>Queue</column>
      <column>PowName</column>
      <column>Isloadbackqueue</column>
      <column>VesselLCG</column>
      <column>20sprojections</column>
      <column>40sProjections</column>
      <column>Code</column>
      <column>IsActive</column>
      <column>Posloctype</column>
      <column>PosId</column>
      <column>YardName</column>
      <column>ActivationChanged</column>
    </columns>
    <rows>
      <row primary-key="3076169">
        <field>HAJJ-load-01A</field>
        <field />
        <field>false</field>
        <field>7285</field>
        <field>0</field>
        <field>0</field>
        <field>HAJJ01 02</field>
        <field>false</field>
        <field>Vessel</field>
        <field>HAJJ_267E</field>
        <field>WHA</field>
        <field>2022-03-15 09:16:57.784</field>
      </row>
      <row primary-key="3077446">
        <field>HAJJ-load-05A</field>
        <field />
        <field>false</field>
        <field>5905</field>
        <field>0</field>
        <field>0</field>
        <field>HAJJ05 06</field>
        <field>false</field>
        <field>Vessel</field>
        <field>HAJJ_267E</field>
        <field>WHA</field>
        <field>2022-03-15 10:46:53.349</field>
      </row>
    </rows>
  </data-table>
</query-response>

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

解析

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

        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!-- nutz 作为 json 打印的工具类-->
         <dependency>
            <groupId>org.nutz</groupId>
            <artifactId>nutz</artifactId>
            <version>1.r.67</version>
        </dependency>

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


import java.io.Serializable;

/**
 * navis 作业岸桥
 * @author aaa
 * @date 2022/3/16 14:47
 */
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<NavisCrane> xml2Entity(String xml) throws DocumentException {
        xml = xml.replaceAll("\n", "");
        List<String> columnList = new ArrayList<>();
        List<NavisCrane> 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<Element> 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<Element> elRowList = elRows.elements();
            entityList = entityListMapping(elRowList);
            System.out.println("entityList---:" + Json.toJson(entityList, JsonFormat.tidy()));
        } else {
            // elDataTable 为 null
        }
        return entityList;
    }
    protected static List<NavisCrane> entityListMapping(List<Element> elRowList) {


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

            List<Element> 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"
    }
]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值