我将使用以下类来解组适当的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没有任何错误。
有人可以解释为什么会发生这种情况吗?我希望收到有关无效标签或类似内容的任何错误。
答案 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
不匹配。
所以这一切都是有效和预期的行为。