XInclude的架构/命名空间验证?
-
11-09-2019 - |
题
我试图使用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处理器验证之前,过程包括...