2012-07-26 84 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