首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取多个名称相同的XML元素JAXB

获取多个名称相同的XML元素JAXB
EN

Stack Overflow用户
提问于 2015-01-29 15:10:55
回答 1查看 1.1K关注 0票数 1

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

我尝试解析从休息服务中检索到的一个庞大的xml文档。我感兴趣的是抽象的部分。

代码语言:javascript
复制
<article article-type="research-article">
    <front>
        <article-meta>
            <abstract></abstract>
            <abstract abstract-type="summary"></abstract>
        </article-meta>
    </front>
</article>

在我的第一堂课上,我做了以下几件事:

代码语言:javascript
复制
@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类。

代码语言:javascript
复制
@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 **/
}

所以,我被困住了,如果有任何提示我会很高兴的。

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-30 07:22:25

我有一个解决方案,但它根本不使用jaxb,甚至不使用数据绑定。因此,如果您坚持数据绑定,我将删除我的答案。否则,我喜欢您指向数据投影 (信息披露:我与该项目有关联),而不是数据绑定:

代码语言:javascript
复制
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类反映XML结构,不如将Java定义为与您喜欢的访问器(和setter)的“投影接口”。然后,让投影框架负责读取和写入对DOM的更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28217986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档