代码之家  ›  专栏  ›  技术社区  ›  Nate

xinclude架构/命名空间验证?

  •  3
  • Nate  · 技术社区  · 15 年前

    我正在尝试使用XML include来帮助管理一个大型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”文件作为独立文件验证fine。

    <?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 回复  |  直到 10 年前
        1
  •  5
  •   swegi    15 年前

    AS 斯卡夫曼 已经指出,XML模式和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文件,然后验证该文件。

    编辑:可以使用 XMLLNT 使用--xinclude验证main.xml。

        2
  •  3
  •   Andreas Maier    12 年前

    我同意grantwparks-xinclude和XML模式绝对可以一起使用。本规范有意相互独立。显然,xinclude的作者希望提供允许在验证之前或验证之后对include进行处理的自由。

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

    关于xinclude最常见的问题之一是如何包含 与验证、XSL转换和其他过程交互 可以应用于XML文档。简短的回答是 没有。xinclution不是任何其他XML过程的一部分。这是一个 单独的步骤,您可以在何时何地执行,也可以不执行。 对你有用。

    例如,考虑对模式进行验证。文档可以是 包含前、包含后或两者都有效。如果您验证 在XI之前的文档:包含元素被替换,然后 Schema必须声明XI:包含元素,就像它将 声明任何其他元素。如果在 XI:包含元素被替换,则模式必须声明 更换元件。包含和验证是分开的, 可按任意顺序执行的正交过程 在当地环境中很方便

    所以,归结起来就是让XML工具在验证之前处理XI:Enrimes元素(这就是OP需要的例子)。例如,在Eclipse的XML编辑器中,在XML>的XML文件下有一个“进程XML包含”的设置&验证(使用RSA 8.5),它需要被打开以使编辑器处理XI:在验证之前包含。

    安迪

        3
  •  1
  •   skaffman    15 年前

    我认为XML模式和XInclude规范不能保证彼此兼容。个别的XML处理器可能允许这样做,但其他处理器则不允许。

    一般来说,我认为这两个词不应该同时使用。

    另外,我不知道你为什么认为这是一个名称空间问题。什么给你这样的印象?

        4
  •  1
  •   grantwparks    13 年前

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