X包含验证问题

时间:2010-12-18 09:11:49

标签: xml xsd xinclude

我希望使用XInclude将XML文件拆分为多个包含。这个方法我优先于其他方法,因为包含的XML文件可以独立为自己验证的文件。

我有以下示例架构(mybook.xsd):


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 elementFormDefault="qualified" 
 attributeFormDefault="unqualified">
 <xs:import 
  namespace="http://www.w3.org/XML/1998/namespace" 
  schemaLocation="http://www.w3.org/2001/xml.xsd"/>
 <xs:element name="mybook">
  <xs:annotation>
   <xs:documentation>Comment describing your root element</xs:documentation>
  </xs:annotation>
  <xs:complexType>
   <xs:sequence>
    <xs:element name="toc">
     <xs:complexType>
      <xs:attributeGroup ref="xml:specialAttrs"/>
     </xs:complexType>
    </xs:element>
    <xs:element ref="part" maxOccurs="unbounded"/>
    <xs:element name="index">
     <xs:complexType>
      <xs:attributeGroup ref="xml:specialAttrs"/>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="part">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="chapter" maxOccurs="unbounded">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="page" maxOccurs="unbounded">
        <xs:complexType>
         <xs:simpleContent>
          <xs:extension base="xs:string">
           <xs:attributeGroup ref="xml:specialAttrs"/>
          </xs:extension>
         </xs:simpleContent>
        </xs:complexType>
       </xs:element>
      </xs:sequence>
      <xs:attributeGroup ref="xml:specialAttrs"/>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
   <xs:attributeGroup ref="xml:specialAttrs"/>
   <xs:attribute name="chaptername" use="required"/>
  </xs:complexType>
 </xs:element>
</xs:schema>

我创建了一个全局元素,因此我可以使用根元素“part”启动一个新的xml元素。现在我的xml文件看起来像:

主文件(mybook.xml):


<?xml version="1.0" encoding="UTF-8"?>
<mybook 
 xsi:noNamespaceSchemaLocation="mybook.xsd" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xi="http://www.w3.org/2001/XInclude" >
 <toc/>
 <part chaptername="Chapter 1" >
  <chapter>
   <page>String</page>
   <page>String</page>
  </chapter>
  <chapter>
   <page>String</page>
   <page>String</page>
  </chapter>
 </part>
  <xi:include href="part2.xml"/>
 <index/>
</mybook>

我的包含文件(part2.xml):


<?xml version="1.0" encoding="UTF-8"?>
<part chaptername="Chapter 2"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:noNamespaceSchemaLocation="mybook.xsd" >
 <chapter>
  <page>String</page>
  <page>String</page>
 </chapter>
 <chapter>
  <page>String</page>
  <page>String</page>
 </chapter>
</part>

在XmlSpy中,现在我可以成功验证part2.xml。但是,在验证mybook.xml时,我收到以下错误:

File mybook.xml is not valid.
 File part2.xml is not valid.
  The 'noNamespaceSchemaLocation' attribute references a schema whose target namespace was already used for validation.
   Error location: part
   Details
    The 'noNamespaceSchemaLocation' attribute references a schema whose target namespace was already used for validation.
    cvc-elt.5.2.1: The element  is not valid with respect to the actual type definition '{anonymous}'.

因为我不熟悉XML,我无法看到(但尝试过几件事)需要做些什么才能让两个XML文件成功地对mybook.xsd进行验证。

任何人都可以帮助我吗?提前致谢

1 个答案:

答案 0 :(得分:2)

您正在遇到使用noNamespaceSchemaLocation的限制。基本上,这可以用作XSD验证器的提示,以了解如何查找模式。或多或少,不允许您多次出现此属性。您可以参考this

所以,发生的事情是遇到第一个noNamespaceSchemaLocation,它告诉验证器如何找到no namespace schema,以便验证“mybook”元素。稍后,当涉及到“part”元素时,会找到另一个noNamespaceSchemaLocation,但是如果这会产生一些其他定义,例如,已经验证的“mybook”元素,那么呢?正是由于这个原因,规范不允许这样的事情,因此你得到了你所记录的错误。

您似乎需要依赖其他方法来告诉验证者如何找到您的架构文档,而不是使用noNamespaceSchemaLocation。