首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAXB忽略响应XML中的“额外”元素

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

Stack Overflow用户
提问于 2014-09-02 18:52:38
回答 2查看 20.1K关注 0票数 12

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

如果响应XML中发生任何更改,有什么方法可以避免代码中断吗?

任何帮助都将不胜感激。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-02 19:02:56

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

代码语言:javascript
复制
@XmlAnyElement(lax = true)
private List<Object> anything;

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

Full details in Blaise's blog

对于被移除的节点,只要您使用的类型可以是null (Integer而不是intBoolean而不是boolean,等等),就应该没问题。

票数 12
EN

Stack Overflow用户

发布于 2014-09-02 19:06:07

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

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

引用自javadoc

此外,解组方法还具有以下特征:

未对输入XML执行

  1. 架构验证。即使XML中有错误,处理也会尽可能地继续。只有在万不得已的情况下,此方法才会因DataBindingException.

而失败

因此,JAXB.unmarshal()所做的就是尝试将尽可能多的数据从XML语言“传输”到Java语言中,它不关心是否有用于XML元素或属性的Java域,也不关心是否有没有XML元素或属性的Java域。

示例

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

代码语言:javascript
复制
<p hi="Yo">
    <y>123</y>
    <peach>weor</peach>
</p>

Java代码:

代码语言:javascript
复制
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包含一个可以与Point.y匹配的元素<y>,因此解析了一个int并将其设置为Point.y。找不到Point.x的XML数据,因此未触及该数据。属性hi和XML元素<peach>没有匹配项,因此它们根本不能用于任何用途。

我们在这里完全没有Exception,最大的可能是解析并将其从XML语言传输到Java语言。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25621655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档