5

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

那么命名空间的 animport比“只是”将该命名空间绑定到前缀意味着什么?

从我读到的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 -->

http://www.ivoa.net/xml/VOResource/v1.0上述架构文档中的命名空间既绑定到vr前缀,又被导入。其他命名空间只绑定到某些前缀而不是导入。文档的其余部分使用来自vr(绑定和导入)和ssa(绑定但未导入)前缀的组件。有什么不同?

4

2 回答 2

13

好吧,您需要学习 XML 基础知识才能理解所有这些内容......

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

xs:schema

你认为这是 <schema> 元素的名称。但实际上,该元素的真实名称(XML 解析器/处理器使用它操作)是这样的:

{http://www.w3.org/2001/XMLSchema}schema

花括号中的东西表示命名空间,它是全名的有效部分。

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

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

但是您是否愿意让您的 XML 文件充满如下名称:

{http://www.w3.org/2001/XMLSchema}schema

您将无法在那里阅读任何内容,对吗?

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

xmlns:xs="http://www.w3.org/2001/XMLSchema"

xs是那个前缀(代表命名空间)。现在,你可以在任何地方简单地写:

xs:schema

命名空间前缀本身是一个本地的东西(对于您的 XML 文件来说是本地的)。您同样可以为此使用任何其他字符串,例如“xsd”:

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

然后写

xsd:schema

根 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"/>

namespace属性指定您导入的名称空间 URI。该import元素实际上应该只导入不同的名称空间(不是您用架构描述的名称空间的一部分;为此还有另一个 XSD 元素:)include。因此,您对 的import操作称为命名空间的导入

schemaLocation属性告诉模式解析器导入的模式 (XSD) 文件的物理位置。这是可选属性。一些 XML 模式软件可能保存描述一些重要名称空间(特别是由 W3C 维护的那些)的 XML 模式的本地副本。因此,只有命名空间 URI 可能足以提示他们应该在哪里获取相应的 XSD 文件本身。


简而言之:

  • 命名空间绑定是什么意思?它允许您为命名空间 URI(它是一个长字符串)引入一个短的(命名空间前缀)。通过将名称空间前缀添加到本地名称,您可以告诉 XML 处理器该 XML 名称属于哪个名称空间。这里的“命名空间”是一个抽象概念。它只是扩展任何 XML 名称以使它们绝对唯一。但是,命名空间绑定并不假定有任何模式以及为该命名空间定义的任何组件!

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

于 2013-06-16T22:38:48.097 回答
2

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

  1. 您需要命名空间声明,以便处理器知道命名空间vr指的是什么

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

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

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

于 2013-06-16T22:37:14.283 回答