给出像这样的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是一个无法识别的类型。
答案 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>
Salary
和Age
是未知类型,并在我们解组时存储在我们的附加列表中:
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