XML命名空间
XML命名空间(XML namespace,也译作XML名称空间、XML名字空间)用于在一个XML文档中提供名字唯一的元素和属性。XML命名空间在W3C推荐规范《Namespaces in XML》 (页面存档备份,存于互联网档案馆)中定义。XML命名空间于1999年1月14日成为W3C的推荐规范。
W3C将XML命名空间定义为以国际化资源标识符(Internationalized Resource Identifier,IRI)引用为标识的元素名和属性名的集合。
使用命名空间的动机
一个XML文档可能包括来自多个XML词汇表的元素或属性,如果每一个词汇表指派一个命名空间,那么相同名字的元素或属性之间的名称冲突就可以解决。举一个简单的例子来说,在一个订单的XML文档中需要引用到客户和所购买的产品,customer元素和product元素可能都有一个叫做id的子元素。这时候要引用id元素会造成名称冲突,但是如果将两个id元素放到不同的命名空间中就会解决这个问题。
声明和引用命名空间
命名空间使用元素的属性来声明,比如:
xmlns:xhtml="http://www.w3.org/1999/xhtml"
其中:
xmlns
是使用专门用来声明命名空间的保留字,- xhtml是命名空间的前缀
- http://www.w3.org/1999/xhtml (页面存档备份,存于互联网档案馆) 是命名空间的唯一标识符,是一个IRI引用,但通常是一个统一资源标志符(URI)引用。
命名空间的声明就是将一个前缀与一个URI关联起来。
声明命名空间时,可以为命名空间定义前缀(见前例)。为命名空间定义前缀,而不直接使用命名空间的URI是因为URI为了唯一通常会很长,直接使用URI不但造成书写和阅读的不便,还会扰乱XML的语法。声明命名空间时,也可以不定义前缀。如:
xmlns="http://www.w3.org/1999/xhtml"
未定义前缀的命名空间將被用作缺省的命名空间。
命名空间的URI仅仅是唯一的标识符,推荐规范不要求,也不建议通过其获取信息。XML解析器处理命名空间URI时,也仅仅将其作为字符串。例如,地址为http://www.w3.org/1999/xhtml (页面存档备份,存于互联网档案馆) 的文档并不包含任何代码,它仅仅为人类阅读者描述了XHTML命名空间。之所以采用URI(如"http://www.w3.org/1999/xhtml")来标识命名空间是因与使用简单的字符串(如xhtml)相比,URI大大降低了命名空间重名的可能性。
XML文档中的元素名和属性名可以使用限定名或非限定名,限定名由命名空间的前缀和局部名组合而成,例如"xhtml:hr"。非限定名只有局部名,没有前缀。非限定名被认为属于缺省命名空间,如果缺省命名空间没有定义,则属于无命名空间。
在一个元素中声明的命名空间,在所有子元素中也有效,一种通常的做法是在XML文档的根元素声明所有命名空间。在子元素中声明的命名空间的前缀可以覆盖父元素中声明的前缀。W3C推荐规范Namespaces in XML 1.1允许取消命名空间的声明,如:
xmlns:xhtml=""
命名空间的名称
虽然术语命名空间的URI被广泛使用,W3C推荐规范称之为命名空间的名称。规范并未强制规定命名空间的名称必须使用URI(即当解析器发现命名空间不是一个合法的URI时应该拒绝该文档),实际上许多XML的解析器允许使用任何字符串。在推荐规范的1.1版,命名空间的名称变成了国际化资源标识符(IRI),IRI允许使用非ASCII码的字符,实际上,非ASCII码字符已经被几乎所有的XML软件所接受。但是命名空间的URI一词还在持续使用,在W3C和其他地方的许多规范中也有使用。
随着命名空间推荐规范的发布,在如何处理相对的URI问题上产生了激烈的争论,一方认为相对的URI应当简单地当作字符串处理,而另一方认为应该根据文档的基准URI将其转换为绝对的URI。[1]。W3C对这一争论的裁定是不赞成使用相对的URI的。[2].
命名空间的URI与HTTP协议没有任何正式的关系,然而HTTP协议形式的URL(例如http://www.w3.org/1999/xhtml)还是被广泛的用作命名空间的URI。规范并未说明如果这样的URL被解引用(dereference,也就是说,如果软件试图从该位置获取一个文档)会发生什么。在这个问题上存在着不同的看法,有些人认为应该在该位置放置一个 (页面存档备份,存于互联网档案馆)RDDL文档[3]。但是总的来说,用户应该假定命名空间的URI只是一个简单的名称,而非万维网上文档的地址。
命名空间宣言
当一个元素带有属性xmlns="",该元素的默认命名空间和它的后代将恢复为“无命名空间”:那就是在任何命名空间里头都不被视为前缀名称。
参考文献
- ^ Leigh Dodds, News from the trenches, 24 May 2000 [2009-11-12], (原始内容存档于2021-06-14)
- ^ Dan Connolly, W3C XML Plenary decision on relative URI references in namespace declarations, 11 Sep 2000
- ^ Elliotte Rusty Harold, RDDL Me This: What Does a Namespace URL Locate?, 20 Feb 2001 [2009-11-12], (原始内容存档于2014-06-20)