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());
            }
        });
    }

}


JAVA      jaxb

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!