第6章 命名空间详解

XML是一种元标记语言,它具有极好的可扩展性,因此当我们需要同时访问多份XML文档,或使用多份DTD中定义的元素或属性,或使用多份Schema中的元素或属性时,完全有可能出现这样一种情况:在同一份XML文档中可能出现多个同名的元素和属性——这多个同名的元素和属性具有不同的含义和作用,但如果我们不从语法上提供区别,则XML处理器将无法区分它们。

为了解决这个问题,XML提供了命名空间支持。前面在介绍Schema时用到过命名空间,可能有读者一直感到疑惑:到底什么是命名空间呢?关于这个问题,先来回想一个场景:在我们漫长的求学、工作生涯中可曾遇到过与自己同名的同学或同事?因为姓名的缘故,笔者经常会遭遇这样的一些事情:有时候公司开员工大会,如果主持人说“下面有请李刚同仁……”,台下往往会有几个人(包括笔者在内)面面相觑,这时候主持人往往会补充“请市场部的李刚同仁……”,然后市场部的李刚就站出来了。注意此处主持人所补充的一个前提或者说一个范围——市场部,在这个范围内,李刚是唯一的,于是就可以根据该范围和名字确定一个人。简而言之,要确定一个人,仅有名字是不够的,还必须有一个确定的范围,这个范围就可以理解为命名空间。

由此可见,命名空间并不是什么高深的知识,它只是为XML元素指定一个范围而已。通过为XML元素和属性指定命名空间,可以更好地区分不同范围的元素和属性。


alt学生提问:如何确定一个XML元素所在的命名空间呢?


答:在使用DTD作为语义约束时,你可以指定一个XML元素属于任何命名空间——随你喜欢,只要所指定的命名空间是一个合法的字符串即可,而对于这个字符串甚至没有太多的约束。这是由于DTD对命名空间的支持是非常有限的,在使用DTD定义元素和属性时并没有为它们指定命名空间。但使用Schema作为语义约束时,Schema的根元素<schema…/>里可以指定targetNamespace属性,其属性值就是该Schema里所有元素和属性所在的命名空间。如果定义Schema时没有指定targetNamespace属性,则该Schema定义的元素和属性将没有命名空间——一份有效的XML文档中,最多只能使用一份无命名空间的Schema作为语义约束。

alt


本章要点

alt 命名空间的意义和作用

alt XML文档中的xmlns属性前缀的作用

alt 如何在XML元素中引入命名空间支持

alt 如何在Schema中使用命名空间

alt 命名空间对XML文档所起的作用

alt 为XML 元素、属性使用命名空间限定

alt 命名空间对一致性约束的影响

alt 命名空间对局部元素、局部属性的强制限定

alt 在DTD中使用命名空间