命名空间简介

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/"

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

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

这样的声明可以应用于元素和属性名称,通过在前面添加相应的前缀和一个冒号分隔符。我们已经看到了book:title元素。

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

由于没有前缀的属性不属于任何 XML 命名空间,因此属性title(属于 author 元素)与例如章节中的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 属性。

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

fnord 命名空间具有与默认命名空间相同的命名空间 URI。那么我们为什么没有简单地使用已经声明的默认命名空间呢?答案是相当复杂的。

  • 不带前缀的属性根本不属于任何 XML 命名空间,甚至不属于默认命名空间;
  • 省略前缀会导致 title-title 冲突;
  • 将其写作 xmlns:title 会声明一个新的带有前缀 title 的命名空间,而不是应用默认的 xmlns 命名空间。

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

有关 XML 命名空间的更多信息,请访问 http://www.w3.org/TR/REC-xml-names/

Qt XML 文档中使用的约定

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

  • 合格名称 是在文档中出现的名称。(在上面的例子中,book:title 是一个合格名称。)
  • 合格名称中的 命名空间前缀 是“:”左侧的部分。(例如,bookbook:title 中的命名空间前缀。)
  • 名称的 本地部分 (也称为本地名称)位于“:”右侧。(因此,《title》是 book:title 的本地部分。)
  • 命名空间 URI (“统一资源标识符”)是命名空间的唯一标识符。它看起来像一个 URL(例如,http://www.example.com/fnord/),但它不需要通过给定的协议在指定地址提供数据。

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

另请参阅DOM 书签应用

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献是各自所有者的版权。本提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款提供的。Qt 和 respective logos 是 The Qt Company Ltd. 在芬兰和/或其他国家的商标。所有其他商标均为各自所有者的财产。