XML命名空间

求闻百科,共笔求闻

XML命名空间XML namespace,也译作XML名称空间XML名字空间)用于在一个XML文档中提供名字唯一的元素和属性。XML命名空间在W3C推荐规范《Namespaces in XML》 中定义。XML命名空间于1999年1月14日成为W3C的推荐规范。

W3C将XML命名空间定义为以国际化资源标识符Internationalized Resource IdentifierIRI)引用为标识的元素名和属性名的集合。

使用命名空间的动机

一个XML文档可能包括来自多个XML词汇表的元素或属性,如果每一个词汇表指派一个命名空间,那么相同名字的元素或属性之间的名称冲突就可以解决。举一个简单的例子来说,在一个订单的XML文档中需要引用到客户和所购买的产品,customer元素和product元素可能都有一个叫做id的子元素。这时候要引用id元素会造成名称冲突,但是如果将两个id元素放到不同的命名空间中就会解决这个问题。

声明和引用命名空间

命名空间使用元素的属性来声明,比如:

xmlns:xhtml="http://www.w3.org/1999/xhtml"

其中:

命名空间的声明就是将一个前缀与一个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="",该元素的默认命名空间和它的后代将恢复为“无命名空间”:那就是在任何命名空间里头都不被视为前缀名称。

参考文献

  1. Leigh Dodds, News from the trenches, 24 May 2000 
  2. Dan Connolly, W3C XML Plenary decision on relative URI references in namespace declarations, 11 Sep 2000 
  3. Elliotte Rusty Harold, RDDL Me This: What Does a Namespace URL Locate?, 20 Feb 2001 

外部链接

参见