常见的 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
其中
1)通过 maven 搭建的Java工程,引入 dom4j 的依赖。
org.dom4j dom4j 2.1.3 org.nutz nutz 1.r.67
2)根据
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 Listxml2Entity(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"
}
]



