1、样例消息
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Root>
<Header>
<Sender>sss</Sender>
<SendTime>2020-05-18 19:38:55</SendTime>
<Receiver>dasdas</Receiver>
<MsgType>fdsfasdf</MsgType>
</Header>
<Body>
<DataType>dasfas</DataType>
<List>
<Item>
<OPERATE>MOD</OPERATE>
<DATA>
<USERADDR>南京</USERADDR>
<USERNAME>王长金</USERNAME>
</DATA>
</Item>
</List>
</Body>
</Root>
目标是将 DATA节点转化为MAP,或者将java对象序列为上述格式,DATA下节点的个数不定
2、Item 节点
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"operate",
"dataNode"
})
@XmlRootElement(name = "Item")
public class ItemNode {
@XmlElement(name = "OPERATE")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String operate;
@XmlJavaTypeAdapter(MapAdapter.class)
@XmlElement(name = "DATA")
private Map<String, String> dataNode;
public String getOperate() {
return operate;
}
public void setOperate(String value) {
this.operate = value;
}
public Map<String, String> getDataNode() {
return dataNode;
}
public void setDataNode(Map<String, String> dataNode) {
this.dataNode = dataNode;
}
}
3、DATA (DataNode) 节点
@XmlAccessorType(XmlAccessType.FIELD)
public class DataNode {
@XmlAnyElement
private List<Element> entries;
public List<Element> getEntries() {
return entries;
}
public void setEntries(List<Element> entries) {
this.entries = entries;
}
}
4、MapAdapter
public class MapAdapter extends XmlAdapter<DataNode, Map<String, Object>> {
@Override
public Map<String, Object> unmarshal(DataNode v) throws Exception {
if (v == null) {
return null;
}
Map<String, Object> map = new HashMap<>();
List<Element> entries = v.getEntries();
if (entries != null && !entries.isEmpty()) {
entries.forEach(ele -> {
String key = ele.getLocalName();
String value = ele.getTextContent();
if (ele.getChildNodes().getLength() > 0) {
Map<String, Object> child = new HashMap<>(10);
unmarshalRecursive(ele.getChildNodes(),child);
map.put(key, child);
}else {
map.put(key, value);
}
});
}
return map;
}
@Override
public DataNode marshal(Map<String, Object> v) throws Exception {
if (v == null) {
return null;
}
DataNode holder = new DataNode();
if (!v.isEmpty()) {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
List<Element> entries = new ArrayList<>();
v.forEach((key, value) -> {
Element ele = doc.createElement(key);
if(value instanceof String){
ele.setTextContent(value.toString());
}else if(value instanceof Map){
marshalRecursive(doc,ele, (Map<String, Object>) value);
}
entries.add(ele);
});
holder.setEntries(entries);
}
return holder;
}
private void unmarshalRecursive(NodeList nodeList, Map<String, Object> map) {
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.hasChildNodes()) {
Map<String, Object> child = new HashMap<>(10);
unmarshalRecursive(node.getChildNodes(),child);
map.put(node.getLocalName(), child);
}
map.put(node.getLocalName(), node.getTextContent());
}
}
private void marshalRecursive(Document doc,Element ele, Map<String,Object> map){
map.entrySet().stream().forEach(e->{
if(e.getValue() instanceof String){
Element element = doc.createElement(e.getKey());
element.setTextContent(e.getValue().toString());
ele.appendChild(element);
}else if(e.getValue() instanceof Map){
Element element = doc.createElement(e.getKey());
marshalRecursive(doc, element, (Map<String, Object>) e.getValue());
}
});
}
}
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!