X包含架构/命名空间验证?

时间:2009-07-08 13:33:47

标签: xml xsd xml-namespaces xinclude

我正在尝试使用XML Includes来帮助管理需要人和机器都可以使用的大型XML结构。

但是在尝试构建可以针对现有架构验证的XML文件时遇到了无数问题。这是我正在尝试做的简化示例。

我的“main.xml”文件无法验证。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xml - This fails to validate. -->
<ns1:main xsi:schemaLocation="http://www.example.com/main main.xsd"
          xmlns:ns1="http://www.example.com/main"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xi="http://www.w3.org/2001/XInclude">

    <name>String</name>
    <xi:include href="child.xml"/> <!-- What I'm trying to do. -->

</ns1:main>

“child.xml”文件可以作为独立文件进行验证。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Child.xml - This validates fine, as a standalone file. -->
<ns1:child xsi:schemaLocation="http://www.example.com/main main.xsd"
           xmlns:ns1="http://www.example.com/main"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <name>String</name>
    <age>String</age>

 </ns1:child>

这是我的架构:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Main.xsd - My Simplified Schema -->
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:ns1="http://www.example.com/main"
            targetNamespace="http://www.example.com/main">

    <!-- Main Element (References Child) -->
    <xs:element name="main">
         <xs:complexType>
             <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:element ref="ns1:child"/>
             </xs:sequence>
         </xs:complexType>
    </xs:element>

    <!-- Child Element -->
    <xs:element name="child">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
     </xs:element>

</xs:schema>

我的问题几乎与名称空间明显相关,但我对如何解决问题感到茫然。

4 个答案:

答案 0 :(得分:5)

正如 skaffman 已经指出的那样,XML Schema和XInclude不兼容。

来自xmllint的验证错误消息明确指出:

main.xml:9: element include: Schemas validity error : Element  '{http://www.w3.org/2001/XInclude}include': This element is not expected. Expected is ( {http://www.example.com/main}child ).
main.xml fails to validate

引用W3C Recommendation:“XInclude定义与通过应用XML模式生成的增强信息集没有任何关系。这样的增强信息集可以作为输入信息集提供,或者这样的增强可以应用于信息集结果从包含。“

因此,您应首先应用XIncludes构建整个XML文件,然后验证此文件。

编辑:您可以使用 xmllint 和--xinclude来验证main.xml。

答案 1 :(得分:3)

我同意grantwparks - XInclude和XML Schema绝对可以一起使用。规格有意地彼此独立。显然,XInclude的作者希望提供在验证之前或验证之后处理包含的自由。

这个thread on velocityreviews讨论了这个问题,帮助我理解这个问题的答案是this post on xml.com,引用它:

  

关于XInclude的最常见问题之一是包容性   与验证,XSL转换和其他进程交互   可以应用于XML文档。简短的回答是它   没有。 XInclusion不是任何其他XML进程的一部分。它是一个   您可能会或可能不会在何时何地执行的单独步骤   对你有用。

     

例如,考虑针对架构进行验证。一份文件可以   在包含之前,包含之后或两者都经过验证。如果你验证   xi之前的文件:include元素被替换,然后是   schema必须像它一样声明xi:include元素   声明任何其他元素。如果您在之后验证文档   xi:include元素被替换,然后架构必须声明   替换元素。包含和验证是分开的,   可以按任何顺序执行的正交过程   方便的当地环境

所以它似乎归结为,是让你的XML工具在验证之前处理xi:include元素(这就是OP需要的例子)。例如,在Eclipse的XML编辑器中,XML下有一个“Process XML Inclusions”设置 - &gt; XML文件 - &gt;验证(使用RSA 8.5),需要打开以使编辑器在验证之前处理xi:include。

安迪

答案 2 :(得分:1)

我认为XML Schema和XInclude规范不保证彼此兼容。单个XML处理器可能允许它,但其他人不会。

作为一般规则,我会说这两者不应该一起使用。

P.S。我不确定你为什么认为这是命名空间问题。什么给你这种印象?

答案 3 :(得分:1)

我认为这不是由XInclude和架构之间的不兼容造成的;它看起来像在验证之前没有处理包含。因此,模式不允许main中的“include”元素,只允许“child”元素。如果您可以强制XML处理器在验证之前处理包含...