我想解组具有混合内容的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。
答案 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?