Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@XmlAnyElement的XML映射_Java_Xml_Jaxb - Fatal编程技术网

Java 使用@XmlAnyElement的XML映射

Java 使用@XmlAnyElement的XML映射,java,xml,jaxb,Java,Xml,Jaxb,我想达到这样的目标 我尝试添加@XmlElementRef,但仍然不起作用 @XmlElementRefs({ @XmlElementRef(name="Button", type=Button.class), @XmlElementRef(name="Combo", type=Combo.class) }) 好吧,我错过了很多东西。 似乎我添加了这个@XmlRootElement注释到Button和Combo的子类中,以实现这一点 有谁能解释一下为什么我需要在我的子类中添

我想达到这样的目标

我尝试添加@XmlElementRef,但仍然不起作用

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

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


有谁能解释一下为什么我需要在我的子类中添加注释。。。我很困惑,我以为XML只有一个
@XmlRootElement
,在我的例子中,它应该在
MainGroup
类中。

映射您的用例

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

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

@XmlElements({
     @XmlElement(name="Button", type=Button.class),
     @XmlElement(name="Combo", type=Combo.class)
})
public List<Widget> getWidgets() {
    return widgets;
}
@XmlElements({
@XmlElement(name=“Button”,type=Button.class),
@XmlElement(name=“Combo”,type=Combo.class)
})
公共列表getWidgets(){
返回窗口小部件;
}
@xmlements
对应于
xsd:choice
的XML模式概念

关于
@XmlRootElement


好吧,我错过了很多东西。我好像加了一句 将@XmlRootElement注释添加到Button和 组合来实现这一点

有人能解释一下为什么我需要在我的 子类。。。我很困惑,我以为XML只会有一个 @XmlRootElement,在我的例子中,它应该在MainGroup类中

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

@xmlementref

@xmlementref
对应于置换群的概念。在XML模式中,可以指定一个全局元素可以替换另一个全局元素。在JAXB中,利用
@XmlRootElement
(和
@xmlementdecl
)指定全局元素:

@xmlanyement

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


我的相关文章的小部件来自EclipseSWT。而这里的这个小部件类是一个自行创建的类,Button.class和Combo.class是小部件类的子类。这使得
@xmlementrefs({@xmlementref(name=“Button”,type=Button.class),@xmlementref(name=“Combo”,type=Combo.class)})成为可能
<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.
@XmlElementRefs({
     @XmlElementRef(name="Button", type=Button.class),
     @XmlElementRef(name="Combo", type=Combo.class)
})
@XmlElements({
     @XmlElement(name="Button", type=Button.class),
     @XmlElement(name="Combo", type=Combo.class)
})
public List<Widget> getWidgets() {
    return widgets;
}