命名空间简介¶
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:author 和 book:title 元素属于 URI 为 http://www.example.com/fnord/book/ 的命名空间。
两个book:author属性title和name没有分配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是命名空间前缀。)
名称的本地部分(也称为本地名称)出现在“:”的右侧。(因此,title是book:title的本地部分。)
命名空间URI(“统一资源标识符”)是命名空间的唯一标识符。它看起来像一个URL(例如http://www.example.com/fnord/),但不需要通过给定协议在指定地址访问数据。
没有“:”的元素(如示例中的chapter)没有命名空间前缀。在这种情况下,本地部分和限定名称是相同的(即chapter)。
另请参阅
DOM书签应用程序