参考我之前的2篇帖子(post 1,post 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,这可能就是我得到这个命名空间错误的原因。我怎么能在这里避免这个错误?
架构已经在这里。
答案 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