有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我尝试解析从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 **/
}

可悲的是,我只得到了第一个摘要,但也得到了内容。你可以在下面看到我的作者总结课

@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 **/
}

所以,我被困住了,如果有任何提示,我将非常高兴

多谢各位


共 (1) 个答案

  1. # 1 楼答案

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

    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 API定义为一个带有您想要的访问器(和设置器)的“投影接口”。之后,让投影框架负责读写对DOM的更改