JAXB:将无效的xml文档解组为对象

时间:2014-10-27 08:42:02

标签: java jaxb unmarshalling

我将使用以下类来解组适当的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 unmarshall没有任何错误。

有人可以解释为什么会发生这种情况吗?我希望收到有关无效标签或类似内容的任何错误。

1 个答案:

答案 0 :(得分:2)

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

Validating against a Schema with JAXB

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

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

接下来,如果您使用

unmarshaller.unmarshal(streamSource, AddressObject.class);

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

所以这一切都是有效和预期的行为。