6.1 使用命名空间

在XML文档中通过xmlns或者xmlns:prefix来使用命名空间,xmlns或xmlns:prefix是一个特殊的保留属性,你可以为任何XML元素指定任意多个形如xmlns:prefix的属性,用于在一份XML文档中使用多个命名空间。


alt提示

xmlns是XML Namespce的缩写,就是XML命名空间的意思。


虽然一个XML元素可以指定任意多个形如xmlns:prefix的属性,但最多只能指定一个xmlns属性,这是因为xmlns和xmlns:prefix其实是完全统一的,或者说xmlns是xmlns:prefix的特例:当xmlns:prefix中的prefix变为空字符串时,xmlns:prefix中的英文冒号也就省略了,而xmlns:prefix自然也就变成xmlns了。

命名空间只是XML元素和XML属性所在的范围,因此,从语法要求的角度来讲,命名空间可以是一个任意的字符串,但实际使用中往往是一个绝对的URL地址,例如http://www.crazyit. org/schema。


alt注意

根据实际开发经验,为XML元素或属性指定命名空间时以本公司/组织的域名+项目名+模块名作为命名空间比较合适,例如Spring框架就提供了多个Schema,不同Schema定义的元素和属性位于不同的命名空间下:AOP配置的相关元素和属性位于http://www.springframework.org/schema/aop命名空间之内,事务配置相关的元素和属性位于http://www.springframework.org/schema/tx命名空间之内。


由于XML命名空间往往是一个绝对的URL地址,因此它具有两个特征:

alt 名字很长。

alt 名字里往往包含有英文冒号、斜线(/)等特殊字符。

上面两个特征使得无法在元素和属性中直接使用命名空间:名字太长,用起来就会大大降低XML的开发效率;在XML文档中的标识符里,英文冒号有特殊含义,同时其中根本就不允许包含斜线(/)字符。因此,在XML文档中使用命名空间时往往需要指定一个简短的、合法的别名,用这个别名来代表命名空间。

定义命名空间的语法格式是:

alt

从上面的语法可以看出,在XML文档中定义命名空间时,xmlns是固定的,等号后引号里的内容就是元素和属性的命名空间,而xmlns:后的prefix可以随意指定,它是一个简短易记的短名,相当于命名空间的别名。

如下XML文档中包含了2个<name…/>元素:

程序清单:codes\06\6.1\noNamespace.xml

alt

在上面的XML文档中包含了2个<name…/>元素,其中第1个<name…/>元素表示书名,第2个<name…/>元素表示作者名,但仅从XML文档中我们无法区分,为此可以添加命名空间支持。经过修改后的XML文档代码如下:

程序清单:codes\06\6.1\namespace.xml

alt

上面的XML文档中指定了不同的<name…/>元素来自不同的命名空间下,例如第1个<name…/>元素的前缀是crazyit,可见它来自http://www.crazyit.org/crazyit命名空间;第2个<name.../>元素的前缀是book,可见它来自http://www.crazyit.org/book命名空间。

值得指出的是:XML文档中的命名空间是有意义的,但命名空间所对应的前缀(或者说短名)是任意的,没有任何实际意义。XML允许为同一个命名空间指定不同的短名,这对XML本身没有任何影响,也就是说如下XML文档与上例所示完全一样:

alt

在上面的XML文档中,第1次使用<name…/>元素时指定其前缀是wjc,但该前缀依然对应命名空间http://www.crazyit.org/crazyit,因此该<name.../>元素依然来自该命名空间,所以这份XML文档和前一份XML示例其实是同一份文档。