XML Schema import -vs-绑定到前缀的名称空间

Mar*_*tus 4 xml xsd

我是XML Schema的新手,我遇到的架构文档将许多前缀绑定到xsd:schema根元素中的各个命名空间,并且还导入这些模式的子集.在XML Schema文档的其余部分中,他们很乐意使用xsd:schema元素中绑定的所有前缀(无论是否导入).

那么import命名空间的含义是什么意味着"只是"将该命名空间绑定到前缀?

从我阅读的Definitive XML Schema书中可以看到(第66页):

导入用于告诉处理器您将引用其他命名空间中的组件

在我的理解中,这也是一个绑定所做的,那么有什么区别?

具体的例子

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:vr="http://www.ivoa.net/xml/VOResource/v1.0"
           xmlns:ssap="http://www.ivoa.net/xml/SSA/v1.0"
           xmlns:vm="http://www.ivoa.net/xml/VOMetadata/v0.1"
           targetNamespace="http://www.ivoa.net/xml/SSA/v1.0"
           elementFormDefault="unqualified" 
           attributeFormDefault="unqualified"
           version="1.0pr2">


   <xs:import namespace="http://www.ivoa.net/xml/VOResource/v1.0"
         schemaLocation="http://www.ivoa.net/xml/VOResource/v1.0"/>

   <!--  ... rest of the schema document follows -->
Run Code Online (Sandbox Code Playgroud)

http://www.ivoa.net/xml/VOResource/v1.0上述模式文档中的命名空间都绑定到vr前缀并导入.其他名称空间仅绑定到某些前缀而不导入.文档的其余部分使用来自vr(绑定和导入)和ssa(绑定但未导入)前缀的组件.有什么不同?

Col*_*ion 13

那么,您需要了解XML基础知识以了解所有这些事情......

真正的XML名称(即元素或属性的名称......或某些XSD组件,如complexType或group)实际上不是您在特定XML文件(或XML模式)中看到的名称.你看到这样的事情:

xs:schema
Run Code Online (Sandbox Code Playgroud)

你认为这是<schema>元素的名称.但实际上,该元素的真实名称(XML解析器/处理器运行)是这样的:

{http://www.w3.org/2001/XMLSchema}schema
Run Code Online (Sandbox Code Playgroud)

大括号中的东西表示命名空间,它在全名中是有效的.

需要命名空间,因为,例如,此处提到的<schema>元素是W3C提供和维护的XSD语言的一部分.但是假设,其他人也有某种模式(例如某个大型组织的工作模式),并希望用自己的<schema>元素描述这些模式.更重要的是,他们可能最终在同一个XML文件中同时拥有<schema>元素(即他们自己的和W3C).XML解析器如何区分它们?

这里,命名空间有帮助.它们允许用其他东西扩展本地XML名称(在XML中使用),一些额外的字符串足够长以确保它们在地球上的任何XML文件中始终相同.那些长字符串称为名称空间URI,这就是您在上面的花括号中看到的内容.

但是,您是否乐意将XML文件填充为以下名称:

{http://www.w3.org/2001/XMLSchema}schema
Run Code Online (Sandbox Code Playgroud)

你将无法在那里阅读任何东西,对吗?

XML提供了一种解决该问题的方法.您只需要为它声明一些快捷方式,而不是将整个命名空间URI与每个XML名称一起编写.该快捷方式称为名称空间前缀,您可以使用特殊的绑定属性声明它,xmlns:...例如:

xmlns:xs="http://www.w3.org/2001/XMLSchema"
Run Code Online (Sandbox Code Playgroud)

xs是前缀(代表命名空间).现在,您可以随处写作:

xs:schema
Run Code Online (Sandbox Code Playgroud)

名称空间前缀本身是本地的东西(XML文件的本地名称).您可以同样使用任何其他字符串,例如'xsd':

xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Run Code Online (Sandbox Code Playgroud)

然后写

xsd:schema
Run Code Online (Sandbox Code Playgroud)

根XML元素通常包含给定XML中使用的所有命名空间绑定的声明(但是,这不是必需的;绑定对于XML元素的内容是有效的,在该元素中声明它).

当然,一些XML文件(和XSD)可能包含以后从未使用过的命名空间绑定.这不是错误.但这是一种不整洁的工作(与程序中未使用的变量相同).


现在,import元素是什么?它只是将一些外部XML架构导入到您的架构中.导入意味着现在您可以在自己的声明中使用在该导入的模式中定义的任何全局组件.

但请记住,您始终使用完整的XML名称(即本地名称+名称空间URI),因为架构处理器会这样做.导入的外部模式描述了某些不同命名空间中的元素(组件).如果要引用这些组件,则需要告诉XML处理器有关其命名空间的信息,您可以通过绑定到XML中导入的命名空间URI的命名空间前缀来完成.

import元素有两个属性:

<xs:import namespace="http://www.ivoa.net/xml/VOResource/v1.0"
           schemaLocation="http://www.ivoa.net/xml/VOResource/v1.0"/>
Run Code Online (Sandbox Code Playgroud)

namespace属性指定导入内容的名称空间URI.该import元素实际上应该只导入不同的命名空间(不是您使用模式描述的部分;为此,还有另一个XSD元素:)include.那么,你用它做什么import叫做导入命名空间.

schemaLocation属性告诉架构解析器导入的架构(XSD)文件的物理位置.这是可选属性.某些XML模式软件可能包含描述某些重要名称空间(特别是由W3C维护的名称空间)的XML模式的本地副本.因此,只有名称空间URI可能足以暗示他们应该采取相应的XSD文件本身.


简而言之:

  • 命名空间绑定意味着什么?它允许您为名称空间URI(长字符串)引入短(名称空间前缀).通过将名称空间前缀添加到本地名称,可以告诉XML处理器XML名称所属的名称空间.这里的'命名空间'是一个抽象的概念.它只是扩展了任何XML名称,使它们绝对独一无二.但是,命名空间绑定并不假设存在任何具有为该命名空间定义的任何组件的模式!

  • XSD import元素有什么作用?它导入在某个命名空间(在cetain XML模式中)中定义的所有全局组件,并使它们在您的模式中可用.这与URI的特定前缀绑定无关!


Mic*_*Kay 2

如果有对组件的引用,例如vr:someType,则\xc2\xa0:

\n\n
    \n
  1. 您需要命名空间声明,以便处理器知道什么命名空间vr引用什么

  2. \n
  3. 您需要导入声明,以便处理器知道在哪里可以找到该组件vr:someType

  4. \n
\n\n

这有点简化。理论上,导入不会告诉处理器去哪里查找;schemaLocation 只是一个“提示”。实际上,对于大多数处理器来说,schemaLocation 要么是模式文档的实际位置,要么是可以重定向(例如使用目录)到实际位置的 URI。

\n\n

该规范可能有允许的参考,例如vr:someType没有导入的情况下存在),依靠实现定义的机制来定位特定名称空间的模式组件。但它不允许这样做。

\n