Java JAXB编组为DOM文档

时间:2018-11-02 14:37:27

标签: java xml jaxb xmldom

我有JAXB批注:

@XmlElement(name="String")
private String string = "one";

@XmlElement(name="ArrayOne")
private ArrayList<String> array1 = new ArrayList<String>();

和编组:

array.add("Just one");
JAXBContext jc1 = JAXBContext.newInstance( getClass() );
Marshaller marshaller = jc1.createMarshaller();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ; 
Document doc = factory.newDocumentBuilder().newDocument();
marshaller.marshal(this, doc);

如果我深入文档节点,我看不出它们之间的任何区别 节点元素。 我的问题是,如果有任何技巧可以编入DOM文档, 无论简单对象(String),节点元素都将有所不同 或数组对象。马歇尔当然知道字段类型,所以我想知道, 如果在元素数据中添加了一些标志。

DOM结构是

NodeName:String     NodeContent:one
NodeName:ArrayOne   NodeContent:Just one

但是我想要:

NodeName:String     NodeContent:one
NodeName:ArrayOne
    Children:
    NodeName:ArrayOne   NodeContent:Just one

所以我知道,ArrayOne是数组,而不仅仅是一个对象。

请注意,由于并非总是有可用的来源,因此我无法更改注释。

1 个答案:

答案 0 :(得分:2)

您可以使用 @XmlElementWrapper 为集合创建包装元素:

@XmlElement(name="String")
private String string = "one";

@XmlElementWrapper(name="ArrayOne")
private ArrayList<String> array1 = new ArrayList<String>();

此映射的XML输出如下:

<testElement>
    <String>one</String>
    <ArrayOne>
        <array1>one</array1>
    </ArrayOne>
</testElement>

更新评论: 手动在DOM Document上添加包装器(可能有一种更简单的方法,也许通过使用Transformer):

TestElement te = new TestElement();

JAXBContext jc1 = JAXBContext.newInstance(TestElement.class);
Marshaller marshaller = jc1.createMarshaller();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
Document doc = factory.newDocumentBuilder().newDocument();
marshaller.marshal(te, doc);

NodeList nodeList = doc.getDocumentElement().getChildNodes();
Node newNode = doc.createElement("ArrayOneWrapper");
List<Node> arrayOneElements = new ArrayList<>();

for (int i = 0; i < nodeList.getLength(); i++) {
    Node n = nodeList.item(i);

    if (n.getNodeName().equals("ArrayOne")) {
        arrayOneElements.add(n);
    }
}
for (Node n : arrayOneElements) {
    newNode.appendChild(n);
}

XML输出:

<testElement>
    <String>one</String>
    <ArrayOneWrapper>
        <ArrayOne>one</ArrayOne>
        <ArrayOne>two</ArrayOne>
    </ArrayOneWrapper>
</testElement>