我的xml文件中有root元素,如下所示:
<Document xmlns="urn:kad:ns:file:1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
,XSD标题如下:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="urn:kad:ns:file:1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
当我尝试解组文件时:
JAXBContext jc = JAXBContext.newInstance("path.to.package.of.schema.objects");
Unmarshaller u = jc.createUnmarshaller();
// read the file stream and unmarshall the XML
File f = new File(xmlFilePath);
Document document = (Document)u.unmarshal(f);
我收到以下异常:
异常[EclipseLink-25008](Eclipse持久性服务 - 2.1.3.v20110304-r9073):org.eclipse.persistence.exceptions.XMLMarshalException异常 描述:具有默认根元素的描述符 {urn:kad:ns:file:1}在项目中找不到文档
这是否特定于在XSD中将urn作为目标命名空间,或者我在JAVA文件中缺少解组XML文件的内容?
修改
当我从xml文件xmlns="urn:kad:ns:file:1"
中删除默认命名空间声明时,unmarshal进程正常工作。但是没有验证发生,这意味着如果我从XML中删除了一个必需的元素,那么该过程将在JAVA级别继续,并将此元素映射对象视为null。
我想知道这个(根元素中的默认命名空间属性)对解组过程有什么影响?它是否会立即在URN指定的XSD上验证XML(我怀疑它在我的情况下没有找到)?
如果在解析我拥有的XSD时如何验证XML?
答案 0 :(得分:2)
问题出在package-info.java类中。
使用XMLSchema
注释注释的包,其默认命名空间设置为urn:kad:ns:file:1
,与XML(文档)的根映射对象中使用的包不同。
因此,当JAXB尝试解组XML时,它无法在包名称空间中找到(Document)元素,因为首先没有定义名称空间。
Document.java
package path.to.pkg.jaxbobjects;
....
package-info.java
@javax.xml.bind.annotation.XmlSchema(namespace =
"urn:kad:ns:file:1",
elementFormDefault =
javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package path.to.pkg.jaxbobjects2;
删除默认命名空间时,将跳过此操作,并允许对文件进行解组。