常见的 XML 格式字符串数据转 Java对象的场景,一般是 XML 格式字符串数据中的标签名作为Java封装对象的属性名,最近工作中遇到一种格式比较特别的 XML 数据,属性名和属性值通过各自的XML标签定义,需要转换成json格式进行数据处理,本次处理通过java的 dom4j 工具处理,因为数据格式比较特别,特此记录一下,具体的数据格式如下。
<query-response>
<data-table filter="CRANE_FILTER" count="2">
<columns>
<column>Queuecolumn>
<column>PowNamecolumn>
<column>Isloadbackqueuecolumn>
<column>VesselLCGcolumn>
<column>20sprojectionscolumn>
<column>40sProjectionscolumn>
<column>Codecolumn>
<column>IsActivecolumn>
<column>Posloctypecolumn>
<column>PosIdcolumn>
<column>YardNamecolumn>
<column>ActivationChangedcolumn>
columns>
<rows>
<row primary-key="3076169">
<field>HAJJ-load-01Afield>
<field />
<field>falsefield>
<field>7285field>
<field>0field>
<field>0field>
<field>HAJJ01 02field>
<field>falsefield>
<field>Vesselfield>
<field>HAJJ_267Efield>
<field>WHAfield>
<field>2022-03-15 09:16:57.784field>
row>
<row primary-key="3077446">
<field>HAJJ-load-05Afield>
<field />
<field>falsefield>
<field>5905field>
<field>0field>
<field>0field>
<field>HAJJ05 06field>
<field>falsefield>
<field>Vesselfield>
<field>HAJJ_267Efield>
<field>WHAfield>
<field>2022-03-15 10:46:53.349field>
row>
rows>
data-table>
query-response>
其中
标签中的 primary-key
属性是作为唯一标识的,需要提取整个 XML的解析如下。
1)通过 maven 搭建的Java工程,引入 dom4j 的依赖。
<dependency>
<groupId>org.dom4jgroupId>
<artifactId>dom4jartifactId>
<version>2.1.3version>
dependency>
<dependency>
<groupId>org.nutzgroupId>
<artifactId>nutzartifactId>
<version>1.r.67version>
dependency>
2)根据
标签中的字段对应封装Java接收类,每一个
标签的内容对应Java接收类中的一个属性,此外
标签中的 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"
}
]