JAXB忽略Response XML中的'额外'元素

时间:2014-09-02 10:52:38

标签: java xml jaxb annotations

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

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

任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:16)

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

默认情况下,这是非常自由的。

引用javadoc

  

此外,unmarshal方法具有以下特征:

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

那么JAXB.unmarshal()所做的是它试图"转移"尽可能多的从XML到Java的数据,并且如果没有XML元素或属性的Java字段,它也不在乎,并且它也不关心是否存在Java字段。没有XML元素或属性。

实施例

让我们尝试将以下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]"

我们告诉JAXB.unmarshal()解析java.awt.Point个实例。输入XML包含一个元素<y>,可以与Point.y匹配,因此解析int并设置为Point.y。没有找到Point.x的XML数据,所以没有触及。属性hi和XML元素<peach>不匹配,因此它们根本不用于任何内容。

我们这里绝对没有Exception,并且最可能的是解析并从XML转移到Java。

答案 1 :(得分:10)

要处理未知字段,您可以添加注释为List<Object>的{​​{1}}属性

@XmlAnyElement(lax=true)

输入中与该类的显式属性不对应的任何元素都将被清除到此列表中。如果@XmlAnyElement(lax = true) private List<Object> anything; 已知该元素,您将获得未编组的表单(JAXBContext带注释的类或@XmlRootElement),如果该元素未被上下文所知,则&# 39;得到JAXBElement<Foo>

Full details in Blaise's blog

对于删除的节点,只要您使用可以为null(org.w3c.dom.Element而不是Integerint的类型而不是Boolean等。)