在项目中找不到具有默认根元素的描述符jaxb unmarshall

时间:2016-11-14 15:23:26

标签: java xsd jaxb unmarshalling

我的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?

1 个答案:

答案 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;

删除默认命名空间时,将跳过此操作,并允许对文件进行解组。