命名空间简介
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: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 是 book: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. 在芬兰和/或其他国家的商标。所有其他商标均为各自所有者的财产。