| 文章首页 |
|---|
| XML Namespace命名空间上手指南 |
| 什么是命名空间(Namespace) |
| XML为什么需要命名空间? |
| XML命名空间的语法规则 |
| 解析器是怎样处理XML命名空间的? |
| 命名空间和DTD |
| 命名空间和XML模式 |
页7 共7页
到目前为止,我们已经了解了如何声明和使用现有命名空间。现在,让我们了解如何创建一个新命名空间,并使用XML模式将元素和属性添加到其中。XML模式首先是一个XML。换言之,同任何其他XML文档一样,XML模式使用元素和属性构建。此“构建材料”必须出自命名空间 http://www.w3.org/2001/XMLSchema,它是已声明和保留的命名空间,其中包含W3C XML模式结构规范和W3C XML模式数据类型规范中定义的元素和属性。不应将元素或属性添加到该命名空间。
使用这些构建块,可以根据需要创建新元素和属性,并对这些元素和属性附加所需的约束,并将其保留在某个命名空间中。(请参见图 1。)XML 模式将此特殊命名空间称作 {目标命名空间},即新建的元素和属性将驻留到的命名空间。

图1 XML 模式命名空间中的元素和属性用于编写 XML 模式文档,该文档生成由用户定义的元素和属性并将其置于 {目标命名空间} 中。此 {目标命名空间} 随后用于验证 XML 实例。
此 {目标命名空间} 从 XML 实例中引用,以确保实例文档的有效性。(请参见图 2。)在验证过程中,验证器验证实例中所用的元素/属性是否存在于已声明的命名空间中,并检查是否对其结构和数据类型存在其他约束。

XML的限定或未限定
在XML模式中,我们可以选择指定实例文档是必须限定所有元素和属性,还是只限定全局声明的元素和属性。无论做出什么样的选择,都将验证整个实例。那么,我们为什么有两个选择呢?答案是“可管理性”。当我们选择限定时,我们指定实例中的所有元素和属性都必须有一个命名空间,这将增强实例的命名空间复杂性。比如,当因将某些局部声明变为全局声明和/将某些全局声明变为局部声明而修改了模式时,根本不会影响实例文档。相反,如果选择非限定,则指定只有实例中全局声明的元素和属性才必须具有命名空间,从而隐藏实例的命名空间复杂性。但在此情形下,比如,当因将某些局部声明变为全局声明和/将某些全局声明变为局部声明而修改了模式时,将影响所有实例文档 — 且实例不再有效。如果试图根据已修改的XML模式验证该实例,则XML模式验证器将报告验证错误。因此,必须根据XML模式中所作的修改修正命名空间,才能重新使该实例有效。
<?xml version="1.0" encoding="US-ASCII"?>元素<schema>的最近子元素为全局声明,而其他元素则为局部声明。在以上示例中,Book和BookType被全局声明,而Title和Author则被局部声明。
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.library.com"
targetNamespace="http://www.library.com"
elementFormDefault="qualified">
attributeFormDefault="unqualified">
<element name="Book" type="tns:BookType" />
<complexType name="BookType">
<sequence>
<element name="Title" type="string" />
<element name="Author" type="string" />
</sequence>
</complexType>
</schema>
可以通过将模式元素属性 elementFormDefault 和 attributeFormDefault 设置为 qualified 或 unqualified 表示在限定和非限定之间的选择。
elementFormDefault = (qualified | unqualified) :unqualified当将elementFormDefault设置为qualified时,它表示在该语法的实例中,必须使用前缀或通过设置 {默认命名空间} 来显式限定所有元素。unqualified设置意味着只有全局声明的元素才必须被显式限定,而局部声明的元素不得被限定。在此情形下,限定一个局部声明是错误的。同样,将 attributeFormDefault设置为qualified时,必须使用前缀显式限定实例文档中的所有属性。
attributeFormDefault = (qualified | unqualified) :unqualified
注意,{默认命名空间} 不应用于属性;因此,不能使用 {默认命名空间} 声明限定属性。Unqualified 好像暗示通过包含的元素位于命名空间中。这很有趣,对吧?
在下图中,概念符号空间类似于命名空间分区的非规范性概念。例如,如果将命名空间比作电冰箱,那么符号空间就是冰箱中的架子。就像架子对电冰箱中的整个空间进行分区一样,符号空间对命名空间进行分区。
命名空间中有三个主要分区:一个用于全局元素声明,一个用于全局属性声明,一个用于全局类型声明 (complexType/simpleType)。这种安排表示,全局元素、全局属性和全局类型可以具有相同的名称,并可以在 {目标命名空间} 中共存而不发生任何名称冲突。此外,每个全局元素和全局 complexType 拥有其自己的符号空间来包含局部声明。
让我们来看看属性对 elementFormDefault 和 attributeFormDefault 的四种可能的值组合。
情形 1: elementFormDefault=qualified, attributeFormDefault=qualified

此处,{目标命名空间} 直接包含所有元素和属性;因此在该情形中,必须限定所有元素和属性。
情形 2: elementFormDefault=qualified, attributeFormDefault=unqualified

此处,{目标命名空间} 直接包含所有元素,且这些元素的相应属性包含在相应元素的符号空间中。因此,在该情形中,只须限定元素,而不得限定属性,除非属性是全局声明的。
情形 3: elementFormDefault=unqualified, attributeFormDefault=qualified

此处,{目标命名空间} 直接包含所有属性和仅全局声明的元素,同时这些元素在其符号空间中包含其子元素。因此,在该情形中,只虚限定全局声明的元素和所有属性。
情形 4: elementFormDefault=unqualified, attributeFormDefault=unqualified

此处,{目标命名空间} 直接包含仅在全局声明的元素,同时这些元素在其符号空间中包含其子元素。每个元素在其符号空间中包含相应的属性;因此,在该情形中,只需限定仅在全局声明的元素和属性。
以上各图用于直观说明命名空间内直接包含的内容或传递式包含的内容(取决于 elementFormDefault/attributeFormDefault 的值)。该设置表示直接位于 {目标命名空间} 中的元素/属性必须在相应的 XML 实例中拥有一个与其关联的命名空间,而未直接(传递式)位于 {目标命名空间} 中的元素/属性不得在相应的 XML 实例中拥有一个与其关联的命名空间。
(THE END)
如果你喜欢这篇文章,请阅读本文相关的下列内容:
比本文新的文章:
