我正在尝试使用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>
我的问题几乎与名称空间明显相关,但我对如何解决问题感到茫然。
答案 0 :(得分:5)
正如 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 Recommendation:“XInclude定义与通过应用XML模式生成的增强信息集没有任何关系。这样的增强信息集可以作为输入信息集提供,或者这样的增强可以应用于信息集结果从包含。“
因此,您应首先应用XIncludes构建整个XML文件,然后验证此文件。
编辑:您可以使用 xmllint 和--xinclude来验证main.xml。
答案 1 :(得分:3)
我同意grantwparks - XInclude和XML Schema绝对可以一起使用。规格有意地彼此独立。显然,XInclude的作者希望提供在验证之前或验证之后处理包含的自由。
这个thread on velocityreviews讨论了这个问题,帮助我理解这个问题的答案是this post on xml.com,引用它:
关于XInclude的最常见问题之一是包容性 与验证,XSL转换和其他进程交互 可以应用于XML文档。简短的回答是它 没有。 XInclusion不是任何其他XML进程的一部分。它是一个 您可能会或可能不会在何时何地执行的单独步骤 对你有用。
例如,考虑针对架构进行验证。一份文件可以 在包含之前,包含之后或两者都经过验证。如果你验证 xi之前的文件:include元素被替换,然后是 schema必须像它一样声明xi:include元素 声明任何其他元素。如果您在之后验证文档 xi:include元素被替换,然后架构必须声明 替换元素。包含和验证是分开的, 可以按任何顺序执行的正交过程 方便的当地环境
所以它似乎归结为,是让你的XML工具在验证之前处理xi:include元素(这就是OP需要的例子)。例如,在Eclipse的XML编辑器中,XML下有一个“Process XML Inclusions”设置 - &gt; XML文件 - &gt;验证(使用RSA 8.5),需要打开以使编辑器在验证之前处理xi:include。
安迪
答案 2 :(得分:1)
我认为XML Schema和XInclude规范不保证彼此兼容。单个XML处理器可能允许它,但其他人不会。
作为一般规则,我会说这两者不应该一起使用。
P.S。我不确定你为什么认为这是命名空间问题。什么给你这种印象?
答案 3 :(得分:1)
我认为这不是由XInclude和架构之间的不兼容造成的;它看起来像在验证之前没有处理包含。因此,模式不允许main中的“include”元素,只允许“child”元素。如果您可以强制XML处理器在验证之前处理包含...