命名空间简介

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元素将其与章节标题等区分开来,如

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

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

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

命名空间是一个 URI,如http://www.example.com/fnord/book/。这并不意味着必须在这个地址上提供数据;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(属于作者元素)和章节中的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>

文档元素中,我们声明了两个命名空间。默认命名空间http://www.example.com/fnord/适用于书籍元素、章节元素、相应的标题元素,当然也适用于文档本身。

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

titlename这两个book:author属性没有指定 XML 名称空间。它们只是book:author 元素的 "传统 "名称空间的成员,这意味着例如book:author中的两个title属性是被禁止的。

在上例中,我们在http://www.example.com/fnord/名称空间中为book:author 添加了一个title属性,从而规避了最后一条规则:fnord:title来自名称空间,其前缀为fnord,已在book:author元素中声明。

显然,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:title)。
  • 名称的本地部分(也称为本地名称)位于": "的右侧(因此titlebook:title 的本地部分)。
  • 命名空间 URI("统一资源标识符")是命名空间的唯一标识符。它看起来像一个 URL(如http://www.example.com/fnord/),但并不要求数据可以通过指定地址的指定协议访问。

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

另请参阅 DOM 书签应用程序

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.