命名空间简介

Qt XML 模块文档的部分内容假设您已经熟悉 XML 命名空间。这里我们提供一个简短的介绍;如果您已经了解这些内容,请跳转到 Qt XML 文档约定

命名空间是引入到XML中的一个概念,以实现更模块化的设计。借助它们,数据处理软件可以轻松解决XML文档中的命名冲突。

考虑以下示例:

<document>
<book>
  <title>Practical XML</title>
  <author title="Ms" name="Eris Kallisti"/>
  <chapter>
    <title>A Namespace Called fnord</title>
  </chapter>
</book>
</document>

在这里,我们发现了title名称的三种不同用法。如果你想处理这个文档,你会遇到问题,因为每个title应该以不同的方式显示——尽管它们有相同的名称。

解决方案是找到一种方法来识别第一次出现的title作为书名,即使用书籍命名空间的title元素来将其与例如章节标题区分开来,例如:

<book:title>Practical XML</book:title>

book 在这种情况下是一个 前缀,表示命名空间。

在我们能够将命名空间应用于元素或属性名称之前,我们必须先声明它。

命名空间是像http://www.example.com/fnord/book/这样的URI。这并不意味着数据必须在这个地址上可用;URI只是用来提供一个唯一的名称。

我们以与属性相同的方式声明命名空间;严格来说,它们属性。例如,要使http://www.example.com/fnord/成为文档的默认XML命名空间xmlns,我们这样写

xmlns="http://example.com/fnord/"

为了区分http://www.example.com/fnord/book/命名空间与默认命名空间,我们必须为其提供一个前缀:

xmlns:book="http://example.com/fnord/book/"

像这样声明的命名空间可以通过在前面加上适当的前缀和“:”分隔符来应用于元素和属性名称。我们已经在book:title元素中看到了这一点。

没有前缀的元素名称属于默认命名空间。此规则不适用于属性:没有前缀的属性根本不属于任何声明的XML命名空间。属性始终属于它们出现的元素的“传统”命名空间。“传统”命名空间不是XML命名空间,它只是意味着属于一个元素的所有属性名称必须不同。稍后我们将看到如何为属性分配XML命名空间。

由于没有前缀的属性不在任何XML命名空间中,因此属性title(属于author元素)与例如chapter中的title元素之间不会发生冲突。

让我们通过一个例子来澄清这一点:

<document xmlns:book = 'http://example.com/fnord/book/'
          xmlns      = 'http://example.com/fnord/' >
<book>
  <book:title>Practical XML</book:title>
  <book:author xmlns:fnord = 'http://example.com/fnord/'
               title="Ms"
               fnord:title="Goddess"
               name="Eris Kallisti"/>
  <chapter>
    <title>A Namespace Called fnord</title>
  </chapter>
</book>
</document>

document元素中,我们声明了两个命名空间。默认的命名空间http://www.example.com/fnord/适用于book元素、chapter元素、相应的title元素,当然也适用于document本身。

book:authorbook:title 元素属于 URI 为 http://www.example.com/fnord/book/ 的命名空间。

两个book:author属性titlename没有分配XML命名空间。它们只是元素book:author的“传统”命名空间的成员,这意味着例如在book:author中的两个title属性是被禁止的。

在上面的例子中,我们通过从http://www.example.com/fnord/命名空间添加一个title属性到book:author来规避最后一条规则:fnord:title来自在book:author元素中声明的带有前缀fnord的命名空间。

显然,fnord 命名空间与默认命名空间具有相同的命名空间 URI。那么为什么我们不直接使用已经声明的默认命名空间呢?答案相当复杂:

  • 没有前缀的属性不属于任何XML命名空间,甚至不属于默认命名空间;

  • 此外,省略前缀会导致标题-标题冲突;

  • 将其写为xmlns:title将声明一个新的命名空间,前缀为title,而不是应用默认的xmlns命名空间。

使用Qt XML类,可以通过两种方式访问元素和属性:要么通过引用由命名空间前缀和“真实”名称(或本地名称)组成的限定名称,要么通过本地名称和命名空间URI的组合来访问。

更多关于XML命名空间的信息可以在http://www.w3.org/TR/REC-xml-names/找到。

Qt XML 文档中使用的约定

以下术语用于在命名空间的上下文中区分名称的各个部分:

  • 限定名称是文档中显示的名称。(在上面的例子中,book:title 是一个限定名称。)

  • 限定名称中的命名空间前缀是“:”左侧的部分。(在book:title中,book是命名空间前缀。)

  • 名称的本地部分(也称为本地名称)出现在“:”的右侧。(因此,titlebook:title的本地部分。)

  • 命名空间URI(“统一资源标识符”)是命名空间的唯一标识符。它看起来像一个URL(例如http://www.example.com/fnord/),但不需要通过给定协议在指定地址访问数据。

没有“:”的元素(如示例中的chapter)没有命名空间前缀。在这种情况下,本地部分和限定名称是相同的(即chapter)。

另请参阅

DOM书签应用程序