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

Arp*_*wal 11 java xml annotations jaxb

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

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

任何帮助将不胜感激.

谢谢.

icz*_*cza 17

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

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

引用javadoc:

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

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

那么JAXB.unmarshal()它试图将尽可能多的数据从XML传输到Java是什么呢?它并不关心XML元素或属性是否没有Java字段,它也不关心是否存在没有XML元素或属性的Java字段.

让我们尝试将以下XML解组为以下实例java.awt.Point:

<p hi="Yo">
    <y>123</y>
    <peach>weor</peach>
</p>
Run Code Online (Sandbox Code Playgroud)

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]"
Run Code Online (Sandbox Code Playgroud)

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

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


Ian*_*rts 10

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

@XmlAnyElement(lax = true)
private List<Object> anything;
Run Code Online (Sandbox Code Playgroud)

输入中与该类的显式属性不对应的任何元素都将被清除到此列表中.如果元素是已知的,JAXBContext你将得到解组的形式(带@XmlRootElement注释的类或a JAXBElement<Foo>),如果元素不为上下文所知,你将得到一个org.w3c.dom.Element.

Blaise博客中的详细信息.

对于没有获得节点删除你应该罚款,只要你使用的类型,可以为空(Integer而不是int,Boolean不是boolean,等).