首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XInclude模式/命名空间验证?

XInclude模式/命名空间验证?
EN

Stack Overflow用户
提问于 2009-07-08 13:33:47
回答 4查看 6.1K关注 0票数 4

我正在尝试使用XML Includes来帮助管理一个大型的XML结构,该结构需要同时可供人类和机器使用。

但是,在尝试构建可以根据现有模式进行验证的XML文件时,我遇到了无数的问题。这是我想要做的一个简化的例子。

我的"main.xml“文件没有验证。

代码语言:javascript
复制
<?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“文件验证为独立文件。

代码语言:javascript
复制
<?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>

这是我的方案:

代码语言:javascript
复制
 <?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>

我的问题几乎-显然与名称空间有关,但我不知道如何解决我的问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-11 15:47:20

正如skaffman已经指出的,XML Schema和XInclude是不兼容的。

来自xmllint的验证错误消息清楚地说明了这一点:

代码语言:javascript
复制
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。

票数 6
EN

Stack Overflow用户

发布于 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。

安迪

票数 4
EN

Stack Overflow用户

发布于 2011-10-06 04:44:21

我不认为这是由于XInclude和模式之间的不兼容造成的;在我看来,在验证之前没有对include进行处理。因此,该模式不允许在main中包含"include“元素,而只允许”子“元素。如果您可以强制XML处理程序在验证之前处理包含内容...

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1098116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档