JAXB生成的类给出了命名空间无法解析的错误

时间:2012-07-27 20:49:34

标签: java namespaces xsd jaxb jaxb2

参考我之前的2篇帖子(post 1post 2)。现在我陷入了另一个奇怪的问题(我是JAXB的noob)。我使用book.xsd(包括bookList和book作为根元素)生成了Java类。一切都很好。现在我正在为评论创建完全独立的XSD。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="reviews">
    <xs:complexType>
         <xs:sequence>
             <xs:element name="review" type="reviewType" minOccurs="0" maxOccurs="unbounded"/>
         </xs:sequence>
         <xs:attribute name="self" type="xs:anyURI" />
    </xs:complexType>
</xs:element>

<xs:complexType name="reviewType">
    <xs:sequence>
        <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="comments" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="rating" type="xs:integer" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
     <xs:attribute name="self" type="xs:anyURI" />
</xs:complexType>

现在,当我使用JAXB生成java类时,它开始给我一些错误,如The element declaration with name 'reviews' and namespace '' cannot be resolved

有什么想法吗?

已更新 我发现我使用的是common.xsd,它在多个xsd中使用了基本信息。像authorType等信息现在我的books.xsd和reviews.xsd正在使用common.xsd,这可能就是我得到这个命名空间错误的原因。我怎么能在这里避免这个错误?

架构已经在这里。

1 个答案:

答案 0 :(得分:4)

你必须将你的模式的元素放入命名空间,因为看起来JAXB无法解析'review'(在全局命名空间''。两个抽搐代表''空命名空间)。您可以通过修改架构的标题来执行此操作:

<?xml version='1.0' encoding='UTF-8'?>
<xs:schema targetNamespace="http://your/namespace/goes/here"
 xmlns="http://your/projects/namespace/goes/here"
 xmlns:xs='http://www.w3.org/2001/XMLSchema'
 elementFormDefault='qualified'>

第2行将您的命名空间定义为架构的目标命名空间。 第3行将您的命名空间放入.xsd文件全局命名空间(因此您不必为元素添加前缀,例如使用xs :)为模式的元素添加前缀。如果要在整个模式中使用它,您当然可以将该行更改为您自己的前缀:

 xmlns:mylib="http://your/namespace/goes/here"

此外,由于您的元素现在位于命名空间中,您必须告诉XML文件在哪个命名空间中查找元素(您可以同时拥有多个命名空间):

 <reviews xmlns="http://your/namespace/goes/here">
 ....
 </reviews>

有关Schema命名空间的更深入讨论,我建议使用本书:XML Schema,作者:Eric van der Vlist,O'REILLY