4

我正在尝试使用 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

4 回答 4

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

引用W3C 建议:“XInclude 定义与通过应用 XML 模式生成的扩充信息集没有任何关系。这种扩充信息集可以作为输入信息集提供,或者这种扩充可能应用于包含产生的信息集。”

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

编辑:您可以将xmllint与 --xinclude 一起使用来验证 main.xml。

于 2009-07-11T15:47:20.137 回答
4

我同意 grantwparks - XInclude 和 XML Schema 绝对可以一起使用。这些规范是有意相互独立的。显然 XInclude 的作者希望提供让包含在验证之前或验证之后处理的自由。

这个关于velocityreviews的帖子讨论了这个问题,帮助我理解这个问题的答案是xml.com上的这篇文章,引用它:

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

例如,考虑针对模式进行验证。可以在包含之前、包含之后或两者都对文档进行验证。如果在替换 xi:include 元素之前验证文档,则架构必须声明 xi:include 元素,就像它声明任何其他元素一样。如果在替换 xi:include 元素后验证文档,则架构必须声明替换元素。包含和验证是独立的正交过程,可以在本地环境中以任何方便的顺序执行

因此,它似乎归结为让您的 XML 工具在验证之前处理 xi:include 元素(这就是 OP 的示例所需要的)。比如在Eclipse的XML Editor中,在XML -> XML Files -> Validation(使用RSA 8.5)下有一个设置“Process XML Inclusions”,需要开启才能让编辑器处理xi:include之前验证。

安迪

于 2012-10-20T14:02:36.863 回答
2

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

于 2011-10-05T20:44:20.973 回答
1

我不认为 XML Schema 和 XInclude 规范可以保证相互兼容。个别 XML 处理器可能允许这样做,但其他人不会。

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

PS我不确定你为什么认为这是一个命名空间问题。是什么给了你这样的印象?

于 2009-07-08T13:42:22.730 回答