XInclude的架构/命名空间验证?(XInclude Schema/Namespace Vali

2019-06-25 10:11发布

我试图使用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>

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

Answer 1:

正如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中。



Answer 2:

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

这对velocityreviews线程讨论这一问题,并帮助我了解此事的回答这个职位上xml.com ,从它引用:

其中一件关于XInclude的最常见的问题是包含如何与验证,XSL转换,并且可以应用到XML文档其他进程进行交互。 简短的回答是,事实并非如此。 XInclusion没有任何其他XML进程的一部分。 它是你可以或可以不执行时间和地点是对你有用的单独步骤。

例如,考虑对一个模式验证。 一个文档可以包含被验证之前,包容性,或两者之后。 如果验证十一前的文件:include元素被替换,然后将模式有权宣布十一:包括就像它会宣布任何其他元素的元素。 如果验证后喜文件:include元素被替换,然后将模式有权宣布更换元素。 夹杂物和验证是可以在它是在本地环境方便任何次序来执行单独的,正交的过程

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

安迪



Answer 3:

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

作为一般规则,我想说的是,两者不宜同时使用。

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



Answer 4:

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



文章来源: XInclude Schema/Namespace Validation?