使用JAXB注释,当每个列表元素具有未知名称时,如何获取包含在元素中的列表的每个XML元素?

时间:2014-02-01 23:03:50

标签: java xml jaxb

这个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.
}

1 个答案:

答案 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