2012-07-26 28 views
3

我想實現類似this使用@XmlAnyElement進行XML映射

<zoo> 
    <lion> ... </lion> 
    <dog> ... </dog> 
</zoo> 

我在這裏有這門課。

public class MainGroup { 
    private List<Widget> widgets; 

    @XmlAnyElement 
    public List<Widget> getWidgets() { 
     return widgets; 
    } 
    public void setWidgets(List<Widget> widgets) { 
     this.widgets = widgets; 
    } 
} 

而且該小組件超得到了子類,如按鈕,組合框... 我想實現這樣的事情。

<MainGroup> 
    <Button>...</Button> 
    <Combo>...</Combo> 
</MainGroup> 

我有此異常

[com.sun.istack.internal.SAXException2: class com.test.Button nor any of its super 
    class is known to this context. 

我嘗試添加@XmlElementRef但它仍然沒有工作。

@XmlElementRefs({ 
    @XmlElementRef(name="Button", type=Button.class), 
    @XmlElementRef(name="Combo", type=Combo.class) 
}) 

回答

0

好的,我錯過了很多東西在這裏。 看來我添加這個@XmlRootElement註釋到我的Button和Combo的子類來實現它。

任何人都可以向我解釋爲什麼我需要在我的子類中的註釋...我很困惑,我認爲一個XML只會有一個@XmlRootElement這在我的情況應該在MainGroup類。

1

映射你的使用情況

我的回答是基於你的相關問題一個收集到的信息:

既然你映射爲你做班沒有源代碼(因此無法添加JAXB註釋),我會建議使用@XmlElements映射。

@XmlElements({ 
    @XmlElement(name="Button", type=Button.class), 
    @XmlElement(name="Combo", type=Combo.class) 
}) 
public List<Widget> getWidgets() { 
    return widgets; 
} 

@XmlElements對應於xsd:choice XML模式的概念。

關於@XmlRootElement

好吧,我缺少了很多東西在這裏。好像我添加了 將這個@XmlRootElement註釋添加到我的Button的子類和 組合來實現這一點。爲什麼我需要在我 子類註釋我

誰能解釋一下......我很困惑,我想到了一個XML只會有一個 @XmlRootElement這在我的情況下,應該在MainGroup類。

@XmlRootElement對應於XML模式中的全局元素,它涉及的內容越多,只是您正在解組的文檔中的根元素。我將描述一對夫婦如下角色:

@XmlElementRef

@XmlElementRef相當於取代基的概念。在XML模式中,您可以指定一個全局元素可以替代另一個全局元素。在JAXB @XmlRootElement(和@XmlElementDecl)被利用來指定全局元素:

@XmlAnyElement

@XmlAnyElement對應於XS的概念:在任何XML Schena。這是非常自由的文檔的一部分。在JAXB中,當您將屬性映射到@XmlAnyElement(lax=true)時,它會將匹配@XmlRootElement聲明的元素轉換爲相應的域對象。

+0

我的相關文章的Widget是從日食SWT。而這裏的Widget類是一個自創的類,Button.class和Combo.class是Widget類的子類。這使得'@XmlElementRefs({0}} {XmlElementRef(name =「Button」,type = Button.class), @XmlElementRef(name =「Combo」,type = Combo.class) }''possible – humansg 2012-07-31 07:17:01