2011-09-02 85 views
2

鑑於像XSD這一個:JAXB可以使用未知類型的已知元素的基類型嗎?

<!-- ... --> 
    <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

+1 - JAXB可以定義首先在繼承層次結構中使用'xsi:type'(http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html)。你的問題是如何處理'xsi:type'不對應於JAXB意識到的類的情況? –

+0

是的,Blaise,我的問題是關於xsi:type對應於JAXB不知道的類的情況。 –

回答

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 
+0

+1 - 同樣如果你設置了'@XmlAnyElement(lax = true)',那麼你的JAXB實現會將已知類型轉換爲對象形式:http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build -generic.html –

+0

使用'@ XmlAnyElement'的問題是您必須查看元素列表才能找到所需的元素。例如,就我而言,我希望能夠使用JAXB,即使有人用我不知道的新類型更新XML模式,但是這是已知類型的擴展。另外,'@ XmlAnyElement'需要將添加的元素添加到任何未知元素可能出現的位置,我不知道這些位置。我雖然可能會有一些配置選項或選項可以允許這樣做。 –