JAXB将XML的一部分解组为类,并将其作为元素或节点保留

时间:2016-08-15 16:39:45

标签: java jaxb

是否有办法将XML文档部分解组到Java类中(例如,直到某个深度),并将其余部分保留为节点或元素(甚至是XML字符串或文档),可以从未编组的部分访问。

E.g。我有一个XML:

<customer>
  <name>Mike</name>
  <items>
    <item>Car</item>
    <item>Boat</item>
  </items>
</customer>

和Java类:

@XmlRootElement
public class Customer {

    @XmlElement
    private String name;

    // something like this:
    private Node items;
    // or like this:
    // private String items;
}

原因是因为我对items部分不感兴趣,我将永远不会用Java解析或访问它。 但我需要能够保存它,然后检索它并生成一个完整的XML文档。另一方面,我将在Java代码中使用name元素。

我希望在不必更改Java类的情况下更改items部分的模式(至少是子元素)。

1 个答案:

答案 0 :(得分:0)

您可以使用@XmlAnyElement(lax=true)来处理此用例。此批注允许您将任何XML解组为Java对象(DOM节点)。

@XmlRootElement(name = "customer")
public class Customer {

    @XmlElement
    private String name;
    @XmlAnyElement(lax=true)
    private Object items;    
}

marshaller将正确编写XML节点

JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(reader);

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);