JAXB可以将基类型用于具有未知类型的已知元素吗?

时间:2011-09-02 16:20:09

标签: java jaxb

给出像这样的XSD:

<!-- ... -->
    <xsd:element name="MyElement" type="ParentType" />
<!-- ... -->
<xsd:complexType name="ParentType">
    <xsd:sequence>
        <!-- ... -->
        </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ChildType1">
    <xsd:complexContent>
        <xsd:extension base="ParentType">
            <xsd:sequence>
                <!-- ... -->
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>
<!-- ... -->

可以将JAXB2配置为在必须解组包含未知类型元素的XML时回退到基类型ParentType,如下例所示:

<!-- ... -->
<MyElement xsi:type="ChildType2">
    <!-- ... -->
</MyElement>
<!-- ... -->

通常情况下,在这种情况下,JAXB抛出一个异常,说明ChildType2是一个无法识别的类型。

1 个答案:

答案 0 :(得分:2)

这不是您所需要的,但您可以使用@XmlAnyElement将未知类型解组为DOM元素。

考虑一个Customer类,其中extras字段使用全文@XmlAnyElement进行注释。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
    @XmlElement
    private String name;
    @XmlAnyElement
    private List<Element> extras = new ArrayList<Element>();

    public String getName() {
        return name;
    }

    public List<Element> getExtras() {
      return extras;
    }
}

示例xml:

<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <name>John Doe</name>
    <salary>1000</salary>
    <age>45</age>
</customer>

SalaryAge是未知类型,并在我们解组时存储在我们的附加列表中:

JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Customer customer = (Customer) unmarshaller.unmarshal(reader);
System.out.println(customer.getName());
for (Element el : customer.getExtras()) {
    System.out.println(el.getNodeName() + "->"
               + el.getTextContent());

输出:

John Doe
salary->1000
age->45