JAXB 忽略响应 XML 中的“额外”元素

2022-09-04 06:06:29

我得到了一个XML响应,它不断变化非常频繁(节点不断增加或减少)。在响应xml的每次更新之后,我的代码中断,因为我映射的Java类没有所有文件。

有没有办法在响应 XML 中发生任何更改时避免我的代码中断。

任何帮助将不胜感激。

谢谢。


答案 1

用于简单地从 XML 创建 Java 对象。JAXB.unmarshal()

默认情况下,它非常自由。

引用 javadoc:

此外,非马歇尔方法具有以下特征:

  1. 不对输入 XML 执行架构验证。即使 XML 中存在错误,处理也将尽可能地尝试继续。仅作为最后的手段,此方法在 DataBindingException 中失败。

因此,它试图将尽可能多的数据从XML“传输”到Java,它不关心XML元素或属性是否没有Java字段,也不关心是否存在没有XML元素或属性的Java字段。JAXB.unmarshal()

让我们尝试将以下 XML 取消到 以下的实例:java.awt.Point

<p hi="Yo">
    <y>123</y>
    <peach>weor</peach>
</p>

Java 代码:

String s = "<p hi=\"Yo\"><y>123</y><peach>weor</peach></p>";
Point p = JAXB.unmarshal(new StringReader(s), Point.class);
System.out.println(p); // Prints "java.awt.Point[x=0,y=123]"

我们告诉解析一个实例。输入 XML 包含一个可与之匹配的元素,因此已解析 a 并将其设置为 。未找到 的 XML 数据,因此未触及该数据。属性和XML元素没有匹配,所以它们根本不用于任何事情。JAXB.unmarshal()java.awt.Point<y>Point.yintPoint.yPoint.xhi<peach>

我们在这里完全没有,并且最多可能被解析并从XML转移到Java。Exception


答案 2

若要处理未知字段,可以添加带批注的属性List<Object>@XmlAnyElement(lax=true)

@XmlAnyElement(lax = true)
private List<Object> anything;

输入中与类的显式属性不对应的任何元素都将被扫入此列表中。如果该元素已知,您将获得未编组形式(带注释的类或a),如果该元素对上下文未知,您将获得.JAXBContext@XmlRootElementJAXBElement<Foo>org.w3c.dom.Element

完整的细节在布莱斯的博客

对于被删除的节点,只要使用可以为 null 的类型(而不是 、而不是 等),就应该没问题。IntegerintBooleanboolean


推荐