我是XML Schema的新手,我遇到的架构文档将许多前缀绑定到xsd:schema
根元素中的各个命名空间,还导入这些架构的子集。在XML Schema文档的其余部分中,他们很乐意使用xsd:schema
元素中绑定的所有前缀(无论是否导入)。
那么import
命名空间对'just'将该命名空间绑定到前缀意味着什么呢?
从我读过的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 (绑定但未导入)前缀的组件。有什么区别?
答案 0 :(得分:12)
嗯,你需要转到XML基础知识来理解所有这些......
真正的XML名称(即元素或属性的名称......或某些XSD组件, 像complexType或group)实际上不是你在特定的XML文件(或XML模式)中看到的。你看到这样的事情:
xs:schema
你认为这是&lt; schema&gt;的名称元件。 但实际上,该元素的真实名称(XML解析器/处理器运行)是这样的:
{http://www.w3.org/2001/XMLSchema}schema
大括号中的东西表示名称空间,它在全名中是有效的。
需要命名空间,因为例如&lt; schema&gt;这里提到的元素是W3C提供和维护的XSD语言的一部分。但是假设,其他人也有某种模式(例如某个大型组织的工作模式),并希望用自己的&lt; schema&gt;来描述这些模式。元素。更重要的是,他们最终可能同时拥有&lt; schema&gt;同一XML文件中的元素(即它们自己和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名称,使它们绝对独一无二。但是,命名空间绑定并不假定存在任何具有为该命名空间定义的任何组件的模式!
XSD import
元素有什么作用?它导入在某个命名空间(在cetain XML模式中)中定义的所有全局组件,并使它们在您的模式中可用。这与特定前缀与URI的绑定无关!
答案 1 :(得分:2)
如果有对vr:someType
等组件的引用,则:
您需要名称空间声明,以便处理器知道vr
引用的名称空间
您需要导入声明,以便处理器知道在哪里找到组件vr:someType
这有点简化。从理论上讲,导入并不能告诉处理器在哪里看; schemaLocation只是一个“提示”。实际上,对于大多数处理器,schemaLocation可以是模式文档的实际位置,也可以是可以重定向到实际位置的URI(例如,使用目录)。
规范可以允许vr:someType
之类的引用在没有导入的情况下存在,依赖于实现定义的机制来定位特定命名空间的模式组件。但它不允许这样做。