我希望实现类似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)
})
答案 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
类中。