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

Nat*_*ate 4 xml xsd xinclude xml-namespaces

我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

"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>
Run Code Online (Sandbox Code Playgroud)

这是我的架构:

 <?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>
Run Code Online (Sandbox Code Playgroud)

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

swe*_*egi 6

正如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
Run Code Online (Sandbox Code Playgroud)

引用W3C建议书:"XInclude定义与通过应用XML模式产生的增强信息集没有任何关系.这样的增强信息集可以作为输入信息集提供,或者这种增强可以应用于由包含产生的信息集."

因此,您应该首先通过应用XIncludes构造整个XML文件,然后验证此文件.

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