我正在尝试使用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>我的问题几乎-显然与名称空间有关,但我不知道如何解决我的问题。
发布于 2009-07-11 15:47:20
正如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 schema产生的扩充信息集的关系。这样的扩充信息集可以作为输入信息集提供,或者可以将这种扩充应用于由包含产生的信息集。“
因此,您应该首先通过应用XIncludes来构造整个XML文件,然后再验证该文件。
编辑:可以使用xmllint和--xinclude来验证main.xml。
发布于 2012-10-20 22:02:37
我同意grantwparks的观点-- XInclude和XML Schema绝对可以一起使用。这些规范有意地彼此独立。显然,XInclude的作者希望提供在验证之前或验证之后处理includes的自由。
这篇thread on velocityreviews讨论了这个问题,并引用了this post on xml.com的话来帮助我理解这个问题的答案:
XML最常见的问题之一是,包含如何与验证、
转换和其他可能应用于XInclude文档的过程进行交互。简而言之,它不是。XInclusion不是任何其他XML过程的一部分。这是一个单独的步骤,当它对您有用时,您可以执行,也可以不执行。
例如,考虑针对模式进行验证。文档可以在包含之前和/或包含之后进行验证。如果在xi:include元素被替换之前验证文档,那么模式必须声明xi:include元素,就像声明任何其他元素一样。如果在xi:include元素被替换之后验证文档,那么模式必须声明替换元素。包含和验证是独立的、正交的过程,可以按在本地环境中方便的任何顺序执行
因此,归根结底,似乎是让XML工具在验证之前处理xi:include元素(这就是OP示例所需要的)。例如,在Eclipse的XML Editor中,在XML -> XML Files -> validation (使用RSA8.5)下有一个设置"Process XML include“,需要打开它才能让编辑器在验证之前处理xi:include。
安迪
发布于 2011-10-06 04:44:21
我不认为这是由于XInclude和模式之间的不兼容造成的;在我看来,在验证之前没有对include进行处理。因此,该模式不允许在main中包含"include“元素,而只允许”子“元素。如果您可以强制XML处理程序在验证之前处理包含内容...
https://stackoverflow.com/questions/1098116
复制相似问题