gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:15:46 24 4
gpt4 key购买 nike

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

最佳答案

您尝试使用 @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关于这个话题。

关于java - 使用 JAXB 注释,当每个列表元素的名称未知时,如何获取包装在元素中的列表的每个 XML 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21504816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com