3

我想实现这样的目标

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

2 回答 2

1

映射您的用例

我的回答基于从您的一个相关问题中收集的信息:

由于您正在映射没有源的类(因此无法添加 JAXB 注释),我建议使用@XmlElements映射。

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

@XmlElements对应于 XML Schema 的概念xsd:choice

关于@XmlRootElement

好的,我在这里错过了很多东西。似乎我添加将此 @XmlRootElement 注释添加到我的 Button 和 Combo 子类中以实现此目的。

谁能向我解释为什么我需要在我的子类中使用该注释...我很困惑,我认为 XML 只会有一个 @XmlRootElement 在我的情况下应该在 MainGroup 类中。

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

@XmlElementRef

@XmlElementRef对应于取代基的概念。在 XML 模式中,您可以指定一个全局元素可以替换为另一个元素。在 JAXB中@XmlRootElement(and @XmlElementDecl) 被用来指定全局元素:

@XmlAnyElement

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

于 2012-07-26T14:56:26.597 回答
0

好的,我在这里错过了很多东西。似乎我添加了将此@XmlRootElement注释添加到我的 Button 和 Combo 子类中来实现这一点。

谁能向我解释为什么我需要在我的子类中使用该注释...我很困惑,我认为 XML 只会有一个@XmlRootElement在我的情况下应该在MainGroup课堂上的。

于 2012-07-26T03:18:20.810 回答