嗯,您需要了解 XML 基础知识才能理解所有这些内容......
真实的 XML 名称(即元素或属性的名称...或某些 XSD 组件的名称,
像complexType或group)实际上不是您在特定XML文件(或XML模式)中看到的。你会看到这样的东西:
xs:schema
您认为这是 元素的名称。
但实际上,该元素(XML 解析器/处理器使用它进行操作)的真实名称是这样的:
{http://www.w3.org/2001/XMLSchema}schema
大括号里的东西表示名称空间,这是全名的有效部分。
需要命名空间是因为,例如,这里提到的 元素是 W3C 提供和维护的 XSD 语言的一部分。但是假设其他人也有某种模式(例如某个大型组织的工作模式),并且想要用自己的 元素来描述这些模式。更重要的是,他们最终可能会在同一个 XML 文件中同时拥有两个 元素(即他们自己的元素和 W3C 元素)。 XML 解析器如何区分它们?
在这里,命名空间会有所帮助。它们允许用其他东西扩展本地 XML 名称(在 XML 中使用),一些足够长的额外字符串以确保它们在地球上的任何 XML 文件中始终相同。那些长串被称为命名空间 URI这就是您在上面的大括号中看到的内容。
但是您是否乐意让您的 XML 文件填充如下名称:
{http://www.w3.org/2001/XMLSchema}schema
你将无法在那里阅读任何内容,对吗?
XML 提供了一种解决该问题的方法。
您无需将整个名称空间 URI 与每个 XML 名称一起编写,只需为其声明一些快捷方式即可。那个快捷方式叫做命名空间前缀并且使用特殊的绑定属性来声明它xmlns:...
e.g.:
xmlns:xs="http://www.w3.org/2001/XMLSchema"
Here 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 的某个命名空间前缀来完成的。
The import
元素有两个属性:
<xs:import namespace="http://www.ivoa.net/xml/VOResource/v1.0"
schemaLocation="http://www.ivoa.net/xml/VOResource/v1.0"/>
The namespace
属性指定您导入的内容的命名空间 URI。这import
element 实际上应该只导入不同的命名空间(不是您用架构描述的命名空间的一部分;为此还有另一个 XSD 元素:include
)。那么,你用import
叫做导入命名空间.
The schemaLocation
属性告诉模式解析器导入的模式 (XSD) 文件的物理位置。这是可选属性。某些 XML 模式软件可能保存描述某些重要名称空间(特别是由 W3C 维护的名称空间)的 XML 模式的本地副本。因此,仅命名空间 URI 可能就足以暗示他们应该在何处获取相应的 XSD 文件本身。
简而言之:
命名空间绑定意味着什么?它允许您为命名空间 URI(这是一个长字符串)引入一个短(命名空间前缀)。通过将名称空间前缀添加到本地名称,您可以告诉 XML 处理器该 XML 名称属于哪个名称空间。这里的“命名空间”是一个抽象概念。它只是扩展任何 XML 名称,使它们绝对唯一。但是,命名空间绑定并不假设存在任何模式以及为该命名空间定义的任何组件!
XSD 是什么import
元呢?它导入在某个命名空间(在某个 XML 模式中)定义的所有全局组件,并使它们在您的模式中可用。这与特定前缀与 URI 的绑定无关!