XML - 数据交换管理/命名空间
XML - 数据交换管理
|
相关主题
|
参与进来
|
上一章 | 下一章 |
← JDNC | 商业智能与 XML → |
完成本章后,您将
- 能够理解什么是 XML 命名空间及其用途
- 能够识别 XML 命名空间结构以及每个部分的作用
- 能够想到需要使用命名空间的组织
XML 命名空间是一组由统一资源标识符 (URI) 引用标识的名称,这些名称在 XML 文档中用作元素类型和属性名称。使用 URI 仅仅是因为它们是创建唯一标识符的知名系统。命名空间包含多个部分,包括本地名称、命名空间 URI、前缀和声明。本地名称和命名空间的组合称为通用名称。您可以将命名空间视为一个 **字典**,它为 XML 文档中使用的项目提供定义来源。
所有模式都包含命名空间 http://www.w3.org/2001/XMLSchema-instance。您可以将其视为所有模式都必须引用的主字典,因为它定义了 XML 模式的基本项目。命名空间的地址看起来像 URL,但在 XML 中,我们使用更广泛的术语 **统一资源标识符** (URI)。
由于一个文档可以引用多个命名空间,我们需要一个方便的简写形式来引用命名空间。其中一种常用形式是 **xsd**,如下所示。
xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
xlmns 通知 XML 您正在引用一个命名空间,而 xsd 表示这是命名空间的简写形式。
例如,您可以在 XML 模式中使用以下代码行
<xsd:element name="item" type="xsd:string">
上一行代码指出,元素名称和字符串的定义在 "http://www.w3.org/2001/XMLSchema-instance" 中找到。
命名空间使您能够在 XML 文档中使用多个模式中描述的元素,因此命名空间 URI 的简写形式对于识别您正在引用的命名空间非常有用。
XML 中的命名空间是 1999 年 1 月 W3C 的一项新建议。创建命名空间是为了提供一种非常简单的区分 XML 文档中使用的名称的方法。命名空间的主要目的是为程序员提供一种方法,让他们能够获取所需的元素和属性,同时忽略他们不需要的其他标签。这些对程序员友好的名称在整个互联网上将是唯一的。XML 命名空间建议除了为元素类型和属性定义两部分命名系统外,没有定义其他任何内容。
有关 W3C 建议的更多信息,请访问以下链接:http://www.w3.org/TR/REC-xml-names/。
它主要用于避免命名冲突。如果您在使用的 XML 中没有重复的元素或属性,则不需要命名空间。但是,如果您有重复的元素或属性,它将是有益的。它基本上创建了两个部分的结构,使其变得唯一。例如,您不必只定义元素 A,而是必须使用其他类型的标识符来定义元素 A。这就是 URI 发挥作用的地方。URI 与元素或属性的组合创建了您的命名空间,然后它就成为一个通用名称。
XML 命名空间不同于计算学科中通常使用的“命名空间”,因为 XML 版本具有内部结构,在数学意义上并不是集合。
这是 2 个命名空间声明的示例
<Organization xmlns:addr="http://www.example.com/addresses" xmlns="http://www.example.com/files">
第一个声明将 addr 前缀与“www.example.com/addresses”URI 相关联。第二个声明将 www.example.com/files 定义为默认命名空间。如果没有为该元素定义前缀,则应用默认命名空间。但是请注意,默认命名空间不直接应用于属性。
在 XML 文档中指定通用名称时,您使用基于可选前缀的缩写,该前缀附加到本地名称。这种缩写称为限定名称或 qname。要声明 XML 命名空间,请使用名称为以下形式的属性
xmlns:prefix
这些属性通常称为 xmlns 属性,其值为要声明的 XML 命名空间的名称。这是一个统一资源标识符。属性的第一个形式 (xmlns:prefix) 声明要与 XML 命名空间关联的前缀。第二个形式 (xmlns) 声明指定的命名空间是默认的 XML 命名空间。
- 尝试将命名空间的数量限制在每个文档大约 5 个。如果文档中命名空间超过 5 个,就会变得难以管理。
- 只有在被命名的事物之间确实存在区别时,才在 XML 命名空间中进行区分。
- 尽量将文档保持在命名空间规范形式,因为它们最容易阅读和处理。
- 避免频繁覆盖命名空间,因为它可能会在您的文档中造成混淆。
假设我们要从两个不同的来源获取地址值,一个来源获取邮件地址,另一个来源获取计算机 IP 地址。我们需要创建一个命名空间,以便能够区分这两个地址元素。
邮政地址 XML 文档
<address>100 Elm St., Apt#1</address>
IP 地址 XML 文档
<address>172.13.5.7</address>
如果需要将这些地址元素组合到同一个文档中,我们如何区分它们?我们将为每个地址名称分配一个命名空间。因此,它在两部分中定义,地址元素和 XML 命名空间。每次出现地址元素时,它将不得不查看两件事而不是一件事来进行定义,但这种查找只需要执行一次,因为组合是普遍唯一的。
在这种情况下,我们可以为地址元素创建命名空间
<Example Organization
xmlns: addr="http://www.example.com/postal_addresses"
xmlns="http://www.example.com/ip_addresses">
第一个声明将前缀“addr”与 URI“www.example.com/postal_addresses”相关联,第二个声明将“www.example.com/ip_addresses”设置为默认命名空间。因此,在使用前缀“addr”的地方,它将获取邮政地址,对于其他情况,它将获取 IP 地址。
假设您已创建了一个架构,例如 example.xsd,它位于与您的 XML 文档(例如 example.xml)相同的目录中。在 XML 文档中,您将使用以下代码指示架构的位置。
<xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='example.xsd'>
当然,如果 example.xsd 存储在与 example.xml 相同目录以外的某个地方,则您需要指定完整路径。
- 不同的 XML 技术将以不同的方式处理命名空间。有些会将命名空间声明视为命名空间声明,而有些只会将它们视为属性。
- 命名空间是一种折衷方案,它无法满足所有用户的需求。
- XML 命名空间表面上看起来很简单,但如果处理或管理不当,它们会导致真正的混乱和复杂性增加。要正确管理命名空间,您必须彻底了解构成 XML 命名空间机制的各种概念的含义、规则和含义,并始终坚持简单的约定。
- 如最佳实践中所述,使用超过 5 个命名空间可能会变得难以控制。那么,如果需要使用许多命名空间,大型组织如何解决这种设计难题?这个问题的基本原因是,大多数信息架构的命名约定是基础性的,但在 XML 中,它是在事后才修补的。命名空间很难顺利地整合。