gpt4 book ai didi

java - 获取多个同名的 XML 元素 JAXB

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:53 25 4
gpt4 key购买 nike

可能是一个愚蠢的问题,但我被困住了。

我尝试解析从 REST service 检索到的巨大 xml 文档。 。我感兴趣的是抽象部分。

<article article-type="research-article">
<front>
<article-meta>
<abstract></abstract>
<abstract abstract-type="summary"></abstract>
</article-meta>
</front>
</article>

在我的前类,我做了以下事情:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Front {

@XmlElementWrapper(name = "article-meta")
@XmlElement(name="abstract")
private List<AuthorSummary> authorSummaries = new ArrayList<AuthorSummary>();
/** Getter and Setter **/
}

遗憾的是,我只得到了第一个摘要,但也得到了内容。您可以在下面看到我的 AuthorSummary 类。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class AuthorSummary {

@XmlElement(name = "title")
private String title;
@XmlElement(name = "p")
private String content;
@XmlAttribute(name = "abstract-type")
private String abstractType;
/** Getter and Setter **/
}

所以,我被困住了,很高兴得到任何提示。

非常感谢

最佳答案

我有一个解决方案,但它根本不使用 jaxb 甚至数据绑定(bind)。因此,如果您坚持数据绑定(bind),我将删除我的答案。否则,我喜欢你指向 data projection (披露:我隶属于该项目)而不是数据绑定(bind):

public class ReadElementsWithSameName {

public interface Article {

@XBRead("./@article-type")
String getType();

@XBRead("./front/article-meta/abstract")
List<String> getAllAbstracts();

@XBRead("./front/article-meta/abstract[@abstract-type='summary']")
String getSummary();

}

// Configure the underlying document builder to not load the (nonexisting) DTD
private static final XMLFactoriesConfig nonValidatingConfig = new DefaultXMLFactoriesConfig() {
@Override
public DocumentBuilderFactory createDocumentBuilderFactory() {
DocumentBuilderFactory factory = super.createDocumentBuilderFactory();
try {
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
}
return factory;
}
};

public static void main(String... args) throws IOException {
List<Article> articles = new XBProjector(nonValidatingConfig).io().url("res://data.xml").evalXPath("/article").asListOf(Article.class);
for (Article article:articles) {
System.out.println(article.getType());
System.out.println(article.getSummary());
System.out.println(article.getAllAbstracts());
}
}
}

不必用 java 类反射(reflect) XML 结构,只需将 Java API 定义为带有您喜欢的访问器(和 setter )的“投影接口(interface)”即可。然后,让投影框架负责读取和写入对 DOM 的更改。

关于java - 获取多个同名的 XML 元素 JAXB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28217986/

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