我得到了一个XML响应,它不断变化(节点不断增加或减少)。在响应xml中的每次更新之后,我的代码断开,因为我的映射Java类没有所有文件。
如果在响应XML中发生任何更改,有没有办法避免我的代码中断。
任何帮助将不胜感激。
感谢。
答案 0 :(得分:16)
使用JAXB.unmarshal()
简单地从XML创建Java对象。
默认情况下,这是非常自由的。
引用javadoc:
此外,unmarshal方法具有以下特征:
- 未对输入XML执行架构验证。即使XML中存在错误,处理也会尽可能地继续进行。仅作为最后的手段,此方法因DataBindingException而失败。
醇>
那么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>
。
对于删除的节点,只要您使用可以为null(org.w3c.dom.Element
而不是Integer
,int
的类型而不是Boolean
等。)