gpt4 book ai didi

java - 使用 Jaxb 解码 MixedContent 返回带有 null 变量的对象

转载 作者:行者123 更新时间:2023-12-01 19:35:10 32 4
gpt4 key购买 nike

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

第三个用例将标签之间的文本保留在单个字符串变量中,并将元素保存在列表中。这就是我想要的。不幸的是,我无法让它工作,而且该线程很旧,可能已经过时了。

我已经尝试了带有对象列表和引用类列表的用例#3。我还尝试了@XmlElement 和@XmlValue 注释。

我在 Java SE 版本 12.0.2 的 Maven 项目中使用版本 2.3.1 中的 javax.xml.bind jaxb-api 和版本 2.3.1 中的 org.glassfish.jaxb jaxb-runtime。

我测试过的示例 XML

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

我的类(class)代表

@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 对象中并分配正确的值。解码后,对象变量(textContent 和 ref)为 null。

最佳答案

你可以试试这个:

使用如下引用类,

@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 中看到的)。

此外,我还为混合内容添加了 @XmlAnyElement 注释,使其成为一个列表。这就是修复它的原因。因此,坚持你的类(class),它看起来像下面这样:

@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?

关于java - 使用 Jaxb 解码 MixedContent 返回带有 null 变量的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033608/

32 4 0
文章推荐: java - 创建子类的两种方法实际上是相同的?
文章推荐: java - 当需要 Completable 时返回 Completable