XML命名空间

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

W3C将XML命名空间定义为以国际化资源标识符（，IRI）引用为标识的元素名和属性名的集合。

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

 声明和引用命名空间 
命名空间使用元素的属性来声明，比如：
<nowiki>xmlns:xhtml="http://www.w3.org/1999/xhtml"</nowiki>

其中：
 xmlns是使用专门用来声明命名空间的保留字，
 xhtml是命名空间的前缀
 http://www.w3.org/1999/xhtml  是命名空间的唯一标识符，是一个IRI引用，但通常是一个统一资源标志符（URI）引用。
命名空间的声明就是将一个前缀与一个URI关联起来。

声明命名空间时，可以为命名空间定义前缀（见前例）。为命名空间定义前缀，而不直接使用命名空间的URI是因为URI为了唯一通常会很长，直接使用URI不但造成书写和阅读的不便，还会扰乱XML的语法。声明命名空间时，也可以不定义前缀。如：
<nowiki>xmlns="http://www.w3.org/1999/xhtml"</nowiki>
未定义前缀的命名空间將被用作缺省的命名空间。

命名空间的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允许取消命名空间的声明，如：
<nowiki>xmlns:xhtml=""</nowiki>

 命名空间的名称 
虽然术语命名空间的URI被广泛使用，W3C推荐规范称之为命名空间的名称。规范并未强制规定命名空间的名称必须使用URI（即当解析器发现命名空间不是一个合法的URI时应该拒绝该文档），实际上许多XML的解析器允许使用任何字符串。在推荐规范的1.1版，命名空间的名称变成了国际化资源标识符（IRI），IRI允许使用非ASCII码的字符，实际上，非ASCII码字符已经被几乎所有的XML软件所接受。但是命名空间的URI一词还在持续使用，在W3C和其他地方的许多规范中也有使用。

随着命名空间推荐规范的发布，在如何处理相对的URI问题上产生了激烈的争论，一方认为相对的URI应当简单地当作字符串处理，而另一方认为应该根据文档的基准URI将其转换为绝对的URI。。W3C对这一争论的裁定是不赞成使用相对的URI的。.

命名空间的URI与HTTP协议没有任何正式的关系，然而HTTP协议形式的URL（例如http://www.w3.org/1999/xhtml）还是被广泛的用作命名空间的URI。规范并未说明如果这样的URL被解引用(dereference，也就是说，如果软件试图从该位置获取一个文档）会发生什么。在这个问题上存在着不同的看法，有些人认为应该在该位置放置一个 RDDL文档。但是总的来说，用户应该假定命名空间的URI只是一个简单的名称，而非万维网上文档的地址。

 命名空间宣言 
当一个元素带有属性xmlns=""，该元素的默认命名空间和它的后代将恢复为“无命名空间”：那就是在任何命名空间里头都不被视为前缀名称。

 参考文献 

 外部链接 
 Namespaces in XML 1.0 (Second Edition) 
 Namespaces in XML 1.1 (Second Edition) 
 XML模式：了解命名空间 
 计划使用XML名称空间，第1部分 ，第2部分

 参见 
 命名空间
 XML

Category:XML

ja:Extensible Markup Language#XML名前空間