带有Jaxb的Unmarshall MixedContent返回带有空变量的对象

时间:2019-09-20 18:34:05

标签: java xml jaxb unmarshalling mixed-content

我想解组具有混合内容的XML文件。我在stackoverflow上找到了一个合适的线程(JAXB- @XmlMixed usage for reading @XmlValue and @XmlElement),其中用户bdoughan定义了3个用例来处理混合内容。

第三个用例是将标签之间的文本保留在单个String变量中,并将元素保存在List中。这就是我想要的。不幸的是,我无法使它正常工作,并且线程已经很旧,甚至可能已经过时。

我已经尝试了用例#3和一个对象列表以及一个引用类列表。我也尝试了@XmlElement和@XmlValue注释。

在Java SE版本12.0.2的Maven Projec中,我正在2.3.1版中使用javax.xml.bind jaxb-api和在2.3.1版中使用org.glassfish.jaxb jaxb运行时。

我测试过的示例XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Date>
    2018.06.27
    <reference id="AnyId1">
    </reference>
</Date>

我的班级代表

@XmlRootElement(name="Date")
public class TestPojo {

@XmlMixed
public String getTextContent() {
    return textContent;
}

public void setTextContent(String textContent) {
    this.textContent = textContent;
}

@XmlElementRef(name="reference", type = Reference.class)
public List<Object> getRef() {
    return ref;
}

public void setRef(List<Object> ref) {
    this.ref = ref;
}

String textContent;
List<Object> ref = new ArrayList<Object>();

}    

我希望将xml解组到POJO对象中,并分配正确的值。解组后,Objects变量(textContent和ref)为null。

1 个答案:

答案 0 :(得分:3)

您可以尝试以下方法:

使用以下参考类,

@XmlAccessorType(XmlAccessType.FIELD)
public class Reference {
    @XmlAttribute
    private String id;
}

还有您的Root类,

@XmlRootElement(name="Date")
public class TestPojo {

    @XmlMixed
    @XmlAnyElement
    private List<Object> textContent;

    @XmlElement
    private Reference reference;

}

这将解组给您参考元素以及列表中的所有其他内容。

对于示例,您将有2个条目。日期值/文本以及制表符(\ t)和换行符(\ n),以及另一个带有换行符的条目。

因此,您可以使用此列表来处理内容并使用所需的内容。

如果有一个更清洁的解决方案,我很感兴趣。干杯

更新以回答评论:

为了更清楚地了解此修复程序。我所做的是对单个引用而不是列表使用@XmlElement而不是@XmlElementRef(这是我在xml中看到的cos)。

我还为混合内容添加了@XmlAnyElement批注,使其成为列表。这就是修复它的原因。因此,坚持学习您的课程,如下所示:

@XmlRootElement(name="Date")
public class TestPojo {

    List<Object> textContent;
    Reference ref;

    @XmlMixed
    @XmlAnyElement
    public List<Object> getTextContent() {
        return textContent;
    }

    public void setTextContent(List<Object> textContent) {
        this.textContent = textContent;
    }

    @XmlElement(name="reference")
    public Reference getRef() {
        return ref;
    }

    public void setRef(Reference ref) {
        this.ref = ref;
    }

}

@XmlAccessorType节省了我编写getter和setter的时间。有关此注释对示例的作用(以及与@XmlElement相关的解释),请检查以下内容: What is the difference between using @XmlElement before field and before getter declaration?