除此文档外,请参阅Namespaces Crash Course

XML namespaces 提供了区分重复元素和属性名称的方法。当XML文档包含来自两个或多个不同的XML模式 (或者DTD)的元素和属性时,可能会出现重复元素和属性名称。引用 Wikipedia: "一般来说,namespaces是一个抽象的容器,为项目提供上下文... 它拥有并且允许消除具有相同名称的项目的消歧。"

如果你熟悉C++命名空间、Java包、Perl包或者Python模块导入,那么你已经熟悉了namespaces概念。

XML namespace 由唯一的名称 (称为URI, 而不是URL, 即使它看起来像URL)标识。URI 可以是任何字符串,虽然大多数人选择基于URL的URI,因为URL是实现我们期望的唯一性的一种简单的方法。虽然没有任何理由去阻止其他人使用这个namespaces http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul, 但是不太可能有人会不小心选择这个namespaces。即使他们意外的选择了这个namespaces,他们也不可能在他们的模式/DTD中定义与XUL相同的元素 。

XML namespace中的任何元素类型或者属性名称都可以通过其XML  namespace和其“local name”来唯一标识。 这两个项目一起定义了一个限定名称,或者 QName.

例如: <xul:textbox/> 使用名为"xul"的namespace和本地名称 "textbox"。它不同于例子所示,例如: <foobar:textbox/> 可能出现在同一个文档中。xulfoobar namespaces必须定义在它们所使用的XML文档的顶部, 如下:

 <foobar:some-element 
     xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
     xmlns:foobar="the-foobar-namespace">
   <xul:textbox id="foo" value="bar"/>
   <foobar:textbox favorite-food="pancakes"/>
 </foobar:some-element>

注意我已经在同一个文档中混合了两个<textboxes/> 。区分他们的唯一的方法是他们有不同含义的namespaces.

还有一个事情需要了解:“default namespace(默认namespace)”。每个XML元素有一个 "default namespace", 而且它总是和XUL 元素一起使用。在XUL 文档中,您通常会看到:

 <window
     id="foo"
     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
   ...
   ...
 </window>

在XHTML 文档中,您会看到:

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

与之前相比,这里有一个非常微妙的差别。 我之前写过xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" ,但是这儿的:xul 部分被省略。这意味着对XML解析器来说,http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul 是元素及其后代元素的 default namespace (除非在后代元素上被default namespace覆盖),并且,如果没有namespace 的任何元素(即,没有前缀和colon)属于default namespace。这就是为什么我们可以使用简写<textbox/>来代替XUL中的 <xul:textbox/> (即使后者在没有使用http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul 作为default namespace是正确的) -- XUL namespace被定义为最顶层元素的默认值。换句话说,default namespace允许一种简短的概括被用于一个元素的所有后代元素。

这里有一个问题:在下面的XML文档中,什么namespace包含了foo元素?

  <foo/>

答案是它不在namespace, 或者它在namespace中由空字符串表示:

  <foo xmlns=""/>

第二个例子在语义上等同于第一个例子。

那么第二个问题是:  bar、 baz 和 quux 是什么名称空间中的属性?

 

  <foo bar="value">
    <element xmlns="namespace!" baz="value">
      <element quux="value"/>
    </element>
  </foo>

bar 显然不在namespace中。那么 bazquux怎么样呢?答案是他们也不在namespace中。实际上,在namespace中没有任何前缀不确定的属性,主要是因为XML最初没有namespaces,而且从那时起,所有的XML必须保持在无namespace.这是XML namespaces常年混乱的根源。

文档标签和贡献者

此页面的贡献者: gardenia
最后编辑者: gardenia,