命名空间简介
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”元素来将其与(例如)章节标题区分开来,例如:
<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 命名空间,因此“author”元素中的“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>在document元素内,我们声明了两个命名空间。默认命名空间http://www.example.com/fnord/适用于book元素、chapter元素、相应的title元素,当然也适用于document元素本身。
book:author和book:title元素属于 URI 为http://www.example.com/fnord/book/ 的命名空间。
book:author元素的两个属性title和name未被分配任何 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即为一个限定名。)
- 全称中的命名空间前缀是指“:”左侧的部分。(在book:title 中,book即为命名空间前缀。)
- 名称的本地部分(也称为本地名)位于“:”的右侧。(因此,title是book:title 的本地部分。)
- 命名空间 URI(“统一资源标识符”)是命名空间的唯一标识符。它看起来像一个 URL(例如http://www.example.com/fnord/),但并不要求该地址下的数据必须通过指定协议访问。
没有“:”的元素(如示例中的chapter)没有命名空间前缀。在这种情况下,本地部分和全称是相同的(即chapter)。
另请参阅 DOM 书签应用程序。
© 2026 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.