跳转到内容

XML - 数据交换管理/命名空间

来自 Wikibooks,开放世界中的开放书籍



上一章 下一章
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 地址。

定义 XML 架构的位置

[编辑 | 编辑源代码]

假设您已创建了一个架构,例如 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 中,它是在事后才修补的。命名空间很难顺利地整合。
华夏公益教科书