Namespaces in XML 1.0 W3C 推荐标准不允许取消绑定已经绑定的前缀,而 Namespaces in XML 1.1 W3C 推荐标准则允许这样做。1.0 没有理由不允许取消绑定,不过该错误已经在 1.1 中得到修正。不必知道此差别,这是因为支持 Namespaces in XML 1.1 的 XML 分析器并不多。
尽管取消绑定带前缀的命名空间有一些差别,但这两个版本均允许您取消绑定或删除已声明的 {默认命名空间}:用其他 {默认命名空间} 声明(覆盖声明中的命名空间为空)覆盖已声明的 {默认命名空间}。取消绑定命名空间与未声明命名空间具有同样的效果。此处的Sherlock Holmes - III 和Sherlock Holmes - I 的元素Book、Title 和Author 与命名空间 关联,而Sherlock Holmes - II 的元素 purchase、Title 和Author {没有命名空间}:
xmlns="" /> Sherlock Holmes - I Arthur Conan Doyle Sherlock Holmes - II Arthur Conan Doyle Sherlock Holmes - III Arthur Conan Doyle
此处是根据 XML 1.0 规范中的命名空间取消绑定前缀的无效示例,而根据 XML 1.1 中的命名空间取消绑定前缀则是有效的:
xmlns:lib="">
从此处开始,前缀lib 不能在 XML 文档中使用,因为只要您在元素purchase 的范围内,它就保持未声名状态。当然,您完全可以再次定义它。
无名称空间
如果范围中没有默认命名空间,便不存在命名空间。{默认命名空间} 是使用xmlns 显式声明的命名空间。如果未使用xmlns 声明 {默认命名空间},则不能说元素位于 {默认命名空间} 中。这种情况下,我们可以说元素位于 {无命名空间} 中。当已声明的 {默认命名空间} 被取消声明时,也将应用 {无命名空间}。
摘要:
命名空间和 XML 模式
到目前为止,我们已经了解了如何声明和使用现有命名空间。现在,让我们了解如何创建一个新命名空间,并使用 XML 模式将元素和属性添加到其中。
XML 模式首先是一个 XML。换言之,同任何其他 XML 文档一样,XML 模式使用元素和属性构建。此“构建材料”必须出自命名空间,它是已声明和保留的命名空间,其中包含W3C XML 模式结构规范和W3C XML 模式数据类型规范中定义的元素和属性。不应将元素或属性添加到该命名空间。
使用这些构建块,可以根据需要创建新元素和属性,并对这些元素和属性附加所需的约束,并将其保留在某个命名空间中。(请参见。)XML 模式将此特殊命名空间称作 {目标命名空间},即新建的元素和属性将驻留到的命名空间。
图 1:XML 模式命名空间中的元素和属性用于编写 XML 模式文档,该文档生成由用户定义的元素和属性并将其置于 {目标命名空间} 中。此 {目标命名空间} 随后用于验证 XML 实例。
此 {目标命名空间} 从 XML 实例中引用,以确保实例文档的有效性。(请参见。)在验证过程中,验证器验证实例中所用的元素/属性是否存在于已声明的命名空间中,并检查是否对其结构和数据类型存在其他约束。
图 2:从 XML 模式到 XML 模式实例
限定或未限定
在 XML 模式中,我们可以选择指定实例文档是必须限定所有元素和属性,还是只限定全局声明的元素和属性。无论做出什么样的选择,都将验证整个实例。那么,我们为什么有两个选择呢?
答案是“可管理性”。当我们选择限定时,我们指定实例中的所有元素和属性都必须有一个命名空间,这将增强实例的命名空间复杂性。比如,当因将某些局部声明变为全局声明和/将某些全局声明变为局部声明而修改了模式时,根本不会影响实例文档。相反,如果选择非限定,则指定只有实例中全局声明的元素和属性才必须具有命名空间,从而隐藏实例的命名空间复杂性。但在此情形下,比如,当因将某些局部声明变为全局声明和/将某些全局声明变为局部声明而修改了模式时,将影响所有实例文档 且实例不再有效。如果试图根据已修改的 XML 模式验证该实例,则 XML 模式验证器将报告验证错误。因此,必须根据 XML 模式中所作的修改修正命名空间,才能重新使该实例有效。
attributeFormDefault="unqualified">
元素 的最近子元素为全局声明,而其他元素则为局部声明。在以上示例中,Book 和BookType 被全局声明,而Title 和Author 则被局部声明。
可以通过将模式元素属性elementFormDefault 和attributeFormDefault 设置为qualified或unqualified 表示在限定和非限定之间的选择。
elementFormDefault = ( qualified | unqualified) :unqualified attributeFormDefault = ( qualified | unqualified) :unqualified
当将elementFormDefault 设置为qualified 时,它表示在该语法的实例中,必须使用前缀或通过设置 {默认命名空间} 来显式限定所有元素。unqualified设置意味着只有全局声明的元素才必须被显式限定,而局部声明的元素不得被限定。在此情形下,限定一个局部声明是错误的。同样,将attributeFormDefault 设置为qualified 时,必须使用前缀显式限定实例文档中的所有属性。
注意,{默认命名空间} 不应用于属性;因此,不能使用 {默认命名空间} 声明限定属性。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
此处,{目标命名空间} 直接包含仅在全局声明的元素,同时这些元素在其符号空间中包含其子元素。每个元素在其符号空间中包含相应的属性;因此,在该情形中,只需限定仅在全局声明的元素和属性。
资源
使用以下资源测试示例以及了解有关命名空间和 XML 模式的更多信息。
下载 Oracle 10g XDK 产品版。Oracle XDK 是一套组件、工具和实用程序,它简化了构建和部署基于 XML 的应用程序的工作。与许多共享件和试用版 XML 组件不同,生产版本的 Oracle XDK 得到完全的支持并随附商业再分销许可证。
阅读《W3C XML 模式入门》该文档提供了 XML 模式功能的简明描述,旨在让您快速了解如何使用 XML 模式语言创建模式。XML 模式第 1 部分:结构和XML 模式第 2 部分:数据类型提供了 XML 模式语言的完整规范性描述。
把“XML 技术中心”加入书签无论您是一位初学者、中级或高级 XML 用户,XML 中心都为您提供了最新的内容和开发各种类型 XML 和 Web 服务应用程序的指导。
XML 示例和教程
XML 示例代码
教程系列:Oracle XML 分析器技术
以上各图用于直观说明命名空间内直接包含的内容或传递式包含的内容(取决于elementFormDefault/attributeFormDefault 的值)。该设置表示直接位于{目标命名空间} 中的元素/属性必须在相应的 XML 实例中拥有一个与其关联的命名空间,而未直接(传递式)位于{目标命名空间} 中的元素/属性不得在相应的 XML 实例中拥有一个与其关联的命名空间。
目标命名空间和无目标命名空间
现在,我们知道 XML 模式创建新元素和属性并将其置于称作 {目标命名空间} 的命名空间中。但如果在该模式中未指定 {目标命名空间} 又会怎么样?如果未指定属性targetNamespace,则将不存在 {目标命名空间} 这是合法的 但在targetNamespace 属性中指定一个空 URI 则是“非法”的。
例如,以下代码无效。不能为 {目标命名空间} 指定一个空 URI:
targetNamespace="" . . .>
在此情形中,如果不存在 {目标命名空间},则如前所述,则将新建的元素和属性保存在 {无命名空间} 中。(使用术语 {默认命名空间} 是错误的。)要验证相应的 XML 实例,相应的 XML 实例必须使用 命名空间中的noNamespaceSchemaLocation 属性来引用没有目标命名空间的 XML 模式。
结论
衷心希望此命名空间概述能够帮助您更轻松地迁移到 XML 模式。Oracle XML 开发人员工具包 (XDK) Namespaces in the XML 1.0 W3C 推荐标准中的 W3C 命名空间;您可以通过使用SAXParserFactory 和DocumentBuilderFactory 类中的setNamespaceAware(boolean) 方法打开/关闭命名空间检查(使用 Oracle XDK 中的 JAXP API)。
Rahul Srivastava(rahuls@apache.org) 是 Oracle 应用服务器开发小组的成员,当前致力于 ProcessConnect 组件上的 EAI 空间。他还参与开发了符合 Apache 开放源代码项目 Xerces2-J,该项目符合 W3C 标准,用于验证 XML 分析器,并主要用在 W3C XML 模式支持领域。Rahul 在 Sun Microsystems 的 Web 小组工作时还参与了 JAXP 和 JSR-173 标准的制定。