我试图使用XML包括以帮助管理需要由人类和机器使用了大量的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>

我的问题是几乎显然与命名空间,但我在为如何解决我的问题的损失。

有帮助吗?

解决方案

作为 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中

其他提示

我同意grantwparks - 的XInclude和XML Schema绝对可以一起使用。的规格是彼此独立的故意。显然的XInclude的作者希望提供自由让包括验证之前或确认之后进行处理。

在velocityreviews这线程讨论的问题和答案这帮助我了解此事这个职位上xml.com 时,从它引用:

  

一个关于XInclude的最常见的问题就是如何包容   与验证,XSL转换,以及其他进程进行交互   可施加到一个XML文档。简单的答案是,它   没有。 XInclusion没有任何其他XML进程的一部分。它是一个   你可以或可以不执行在何时何地是单独的步骤   实用性。

     

例如,考虑对一个模式验证。文档可以   包括验证之前,包容性,或两者之后。如果您验证   汐之前在文档:include元素所取代,则   架构有权宣布十一:包括元素,就像它会   声明的任何其它元件。如果后验证文档   XI:include元素所取代,然后将模式具有申报   更换元件。包容性和验证是分开的,   可以在其任何顺序执行正交处理   方便在本地环境中

那么,它似乎归结为,是让你的XML工具来处理汐:包括验证之前的元素(这是什么的OP需要的例子)。例如,在Eclipse的XML编辑器中,有下XML的设定“过程XML夹杂物” - > XML文件 - >验证(使用RSA 8.5),其需要被导通,以获得编辑处理XI:包括前验证

安迪

我不认为XML模式和XInclude的规格保证是彼此相容。个人XML处理器可能会允许它,但另一些则不会。

作为一般规则,我说的是两个不应该被一起使用。

P.S。我不知道为什么你认为这是一个命名空间的问题。是什么让你印象?

我不认为这是由的XInclude和模式之间的不兼容而引起;它看起来对我来说,在包括验证之前没有被处理。这样的架构不允许在主,只有一个“子”元素的“包括”元素。如果你能强迫你的XML处理器验证之前,过程包括...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top