所谓 Xml 名称空间 (Namespace) ,就是可以为 Xml 的 Tag 或者属性增加一个前缀,例如 a:book 、 b:name ,这里的 a 、 b 就是前缀。为了区分前缀,每个前缀可以用一个唯一的 URI 来区分,用 xmlns 这个属性定义在 Xml 节点上。可以用下面两种语法定义前缀。
* xmlns: 前缀 ="URI"
* xmlns="URI"
前一种语法将前缀与 URI 相关联,后一种语法为没有前缀的元素指定一个缺省名称空间 (Namespace) 。这里的 URI 只是一个可以唯一识别的字符串,所指向的网页并不对 Xml 文件产生影响。
举一个非常常见的缺省名称空间 (Namespace) 的例子。
Moved to www.sothink.com.
再举一个非常常见的使用前缀的名称空间 (Namespace) 的例子,前缀是 xsl :
My CD Collection
Title Artist
Xml 名称空间 (Namespace) 的混合使用
Xml 规范的介绍中说, Xml 名字空间 (Namespace) 的作用主要是为了消除歧义,因为不同的 Xml 语句部分可能具有相同名字的 Tag ,通过使用 Xml 名字空间 (Namespace) ,可以为软件开发带来方便。举例而言,下面的例子中两个 Xml 部分都有 Address ,通过名字空间可以很清楚的分开他们。
但问题是,如果没有名称空间 (Namespace) ,把上述示例写成下面的代码,虽然可以清楚地看到存在明显的冲突,但是显然下面的 Xml 代码更加清晰,而且对软件编写不会造成什么困扰。 Xml 是树状结构,不仅仅可以通过 Tag 的名字来找到需要的元素,还可以通过上下文关系和文档结构找到元素,因此消除歧义并不需要 Xml 名称空间 (Namespace) 。
123.45.67.8
比较好的名称空间 (Namespace) 的混合使用
看下面的例子:
site 和 book 都与缺省名字空间“ http://www.sothink.com/product/flash-decompiler-for-mac/index.htm ”关联,而由于前缀 ISBN 的引入, book 可以有两个 id 的属性,一个是 id ,一个是 ISBN:id ,这样就解决了名字相同的冲突。这是一个很纯粹的“书本上的例子”,能帮助理解,但是看不出实际上的用途。
下面是一个实际当中的名称空间 (Namespace) 混合使用的例子。这是一个 Atom 引擎返回的结果,缺省名称空间 (Namespace) 是 http://www.sothink.com/product/swfcatcher/ie/ ,当中的 Tag 和属性是给术语订阅软件使用;而名称空间 http://www.sothink.com/product/swfcatcher/safari/index.php 中的 Tag 是给 OpenSearch 这个服务使用的,从而让 Atom 引擎支持 OpenSearch 。在这个例子中,通过名称空间 (Namespace) 的使用,一个 Xml 文件支持了两个不同服务商写的不同软件。
xmlns:openSearch='http://www.sothink.com/product/swfcatcher/safari/index.php'>
...
不要在名称空间 (Namespace) 上找麻烦
Xml 名称空间 (Namespace) 规范是最受争议的 Xml 基础规范之一。据说 Xml 开发人员中并没有多少人认为自己确实理解了它,在各种 Xml 开发人员邮件列表中经常出现对它的尖刻批评。 Xml 名称空间 (Namespace) 定义的太过自由,让用户可以非常随意的使用,从而出现大量令人难以接受的 Xml 文本。
多个前缀映射到同一个名称空间,这是一个很坏的例子。
同一个前缀则用于多个名称空间,这是另外一个很坏的例子。
Now hear
同一名称空间声明了两个不同的前缀,这又是一个很坏的例子。
遗憾的是,从 Xml 名称空间 (Namespace) 的规范来说,都是允许的。这些文本不但让人类难以理解,对软件而言,也是很灾难性的。
1999 年, Xhtml 1.0 成为最终的建议标准,标准有三种不同的变体,使用三个不同的名称空间。这一决策引起了强烈的反对。因为三个变体之间差别是非常细节的,而过多的名字空间 (Namespace) 会对程序开发造成各种麻烦。最后, Xhtml 工作组发布了新的规范,使用单一名称空间。这个事件告诉大家,不要在名称空间 (Namespace) 上找麻烦,能简化就简化,只有事情存在真正的区别时才在名称空间 (Namespace) 上加以区分。
规范使用名字空间
一个大家比较公认的 Xml 名称空间 (Namespace) 的使用建议是,把所有的名称空间声明都写在根元素中,而且不要为同一名称空间声明两个不同的前缀。比如下面的 Xml 文本就是比较好的文本。
Now hear
当然作为一般的 Xml 文件,彻底不用名称空间 (Namespace) 可能是更好的建议。
如果你是 W3C ,制定出标准来,那用一个名称空间 (Namespace) 也就用吧。下面列出 W3C 指定的一些常用名字空间。
前缀 URI
xml http://www.w3.org/XML/1998/namespace
xsl http://www.w3.org/1999/XSL/Transform
fo http://www.w3.org/1999/XSL/Format
xsd http://www.w3.org/2001/XMLSchema
html http://www.w3.org/1999/xhtml
svg http://www.w3.org/2000/svg