使用@XmlAnyElement进行XML映射

时间:2012-07-26 03:08:12

标签: java xml jaxb

我希望实现类似this的内容。

<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;
    }
}

这个Widget超类有子类,比如Button,Combobox ...... 我想实现这样的目标。

<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)
})

2 个答案:

答案 0 :(得分: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 Schema概念。

关于@XmlRootElement

  

好的,我在这里遗漏了很多东西。好像我补充说   将此@XmlRootElement注释添加到我的Button和的子类中   组合实现这一点。

     

任何人都可以向我解释为什么我需要我的注释   子类......我很困惑,我认为XML只会有一个   @XmlRootElement在我的情况下应该在MainGroup类中。

@XmlRootElement对应于XML模式中的全局元素,它涉及更多只是您要解组的文档中的根元素。我将在下面描述几个角色:

<强> @XmlElementRef

@XmlElementRef对应于替代组的概念。在XML Schema中,您可以指定一个全局元素可替换为另一个。在JAXB中,@XmlRootElement(和@XmlElementDecl)用于指定全局元素:

<强> @XmlAnyElement

@XmlAnyElement对应于XML Schena中xs:any的概念。这是非常自由形式的文档的一部分。在使用@XmlAnyElement(lax=true)映射属性时,在JAXB中,它会将匹配@XmlRootElement声明的元素转换为相应的域对象。

答案 1 :(得分:0)

好的,我在这里遗漏了很多东西。 似乎我添加了这个@XmlRootElement注释添加到我的Button和Combo的子类来实现它。

任何人都可以向我解释为什么我需要在我的子类中使用该注释...我很困惑,我认为XML只有@XmlRootElement,在我的情况下应该在MainGroup类中。