【问题标题】:JAXB: Unmarshall invalid xml document to objectJAXB:将无效的 xml 文档解组为对象
【发布时间】:2014-12-22 09:45:43
【问题描述】:

我将使用以下类来解组适当的 XML 文档:

 @XmlRootElement(name = "address")
 public class AddressObject {

        @XmlElement(name = "domain")
        public String domain = new String();
        @XmlElement(name = "ip-address")
        public String ipAddress = new String();
        @XmlElement(name = "user-agent")
        public String userAgent = new String();
    }

为了解组文件,我使用javax.xml.bind.Unmarshaller。使用以下代码:

JAXBContext context = JAXBContext.newInstance(AddressObject.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
StreamSource streamSource = new StreamSource(new StringReader(SOME_CORRECT_XML_DOC));
JAXBElement<AddressObject> obj = unmarshaller.unmarshal(streamSource, AddressObject.class);

只要使用不正确的xml,它就可以正常工作,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><hello-world></hello-world>

在最后一种情况下,xml 解组没有任何错误。

有人可以解释为什么会这样吗?我预计会收到有关无效标签或类似内容的任何错误。

【问题讨论】:

  • 我认为这是因为默认情况下 JAXB 将公共字段和属性视为已映射。如果您注释一个字段,则它会将该字段和属性视为已映射,从而导致冲突。如果没有@XmlAccessorType(XmlAccessType.FIELD),您应该注释get 或set 方法。 更多信息 - blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html

标签: java jaxb unmarshalling


【解决方案1】:

首先,JAXB 不会自行验证。如果要打开验证,则必须指定架构:

Validating against a Schema with JAXB

JAXB 对映射并不严格。它根据注释获取它可以映射的内容并忽略其余部分。此外,元素的顺序在解组时并不重要。

我是 JAXB 1.x 的长期用户。 JAXB 1.x 非常严格。我非常高兴 JAXB 2 没有那么严格。

接下来,如果你使用

unmarshaller.unmarshal(streamSource, AddressObject.class);

当您明确指定目标类时,您基本上会忽略根元素映射。也就是说,您的hello-world 被接受为根元素,尽管它与您的AddressObject 中的address 不匹配。

所以所有这些都是有效且预期的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多