1

参考我之前的 2 篇文章(第 1篇、第 2篇文章)。现在我陷入了另一个奇怪的问题(我是 JAXB 的菜鸟)。我使用 book.xsd 生成了 Java 类(其中包括 bookList 和 book 作为根元素)。一切正常。现在我正在为评论创建完全独立的 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现在 common.xsd 也被我的 books.xsd 和 reviews.xsd 使用,这可能就是我收到此命名空间错误的原因。我怎样才能在这里避免这个错误?

Schema 已经在这里了。

4

1 回答 1

4

您必须将架构的元素放入命名空间,因为 JAXB 似乎无法解析“评论”(位于全局命名空间“”中。两个 tic 表示“一个空的命名空间”)。您可以通过像这样修改架构的标头来做到这一点:

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

于 2013-04-04T21:29:22.040 回答