这个XML结构如何在JAXB类注释中建模?
<root>
<linksCollection>
<links>
<foo href="http://example.com/foo" rel="link"/>
</links>
<links>
<bar href="http://example.com/bar" rel="link"/>
</links>
</linksCollection>
</root>
从以下根类开始,什么是Link类?如何将每个包含未知元素名称的链接包含在links元素中?
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElement
protected List<Link> linksCollection;
// etc.
}
以下尝试不起作用:
@XmlRootElement(name = "links")
@XmlAccessorType(XmlAccessType.FIELD)
public class Link {
@XmlAnyElement
protected Object link;
@XmlAttribute
protected String href;
@XmlAttribute
protected String rel;
//etc.
}
答案 0 :(得分:2)
您使用@XmlAnyElement
尝试未知元素是正确的方法,但您错过了集合的@XmlElementWrapper
。以下映射为这些元素生成集合:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElementWrapper(name="linksCollection")
@XmlElement(name="links")
protected List<Link> linksCollection;
}
public class Link {
@XmlAnyElement(lax = true)
protected Object content;
}
根据this explanation,如果未指定映射,则集合中将包含org.w3c.dom.Element的实例。
如果您只有有限的未知元素子集,则可以按如下方式更改链接类中的注释:
@XmlElements({
@XmlElement(name = "foo", type = FooBar.class),
@XmlElement(name = "bar", type = FooBar.class) , ...})
protected Object content;
FooBar类可能如下所示:
public class FooBar {
@XmlAttribute(name = "href")
protected String href;
@XmlAttribute(name = "rel")
protected String rel;
}
但是,当您无法预测可能的代码时,我会留在@XmlAnyElement
并添加@XmlTypeAdapter
。关于这个话题还有另一个主题:Jaxb complex xml unmarshall。