【问题标题】:XML - NamespacesXML - 命名空间
【发布时间】:2014-05-26 17:24:38
【问题描述】:

考虑以下 XML 文档:

1 <a
2     x:foo="123" xmlns:x="foo">
3  <b xmlns="bar"
4      y="456">
5   <c xmlns:x="baz">
6    <x:d xmlns="">
7     <e xmlns:y="asdf"/>
8    </x:d>
9   </c>
10  <f xmlns:x="bar"/>
11 </b>
12 </a>

对于第 1-7 行和第 10 行,在该行上声明的元素或属性具有哪个名称空间 URI?某种解释将不胜感激。

【问题讨论】:

    标签: xml namespaces xml-namespaces


    【解决方案1】:

    James Clark 对命名空间的解释

    http://www.jclark.com/xml/xmlns.htm

    一如既往的好。如果您在阅读后仍有疑问,请告诉我们您不明白的部分。

    【讨论】:

      【解决方案2】:

      这里有一个简短的总结。

      • 当您使用xmlns 而不声明前缀时,它声明的命名空间将被该范围内的所有元素(您声明它的元素以及它包含的所有无前缀元素)继承,直到声明另一个具有不同值的xmlns)。

      • 属性不继承命名空间。它们必须带有前缀。

      • 当您使用xmlns:prefix 时,它声明的命名空间将被该范围内的所有前缀元素(您声明它的前缀元素及其包含的所有前缀元素,直到另一个具有不同值的xmlns:prefix 被声明)。如果声明它的元素没有相同的前缀,或者没有前缀,它就不会成为命名空间的一部分。

      基于此,在您的示例中:

      • ae 不属于任何命名空间。 a 因为它没有 xmlns 声明,也没有父母。 e 因为它的父级有一个 xmlns='' 属性,这使得默认命名空间为空。

      • bcf 属于 bar 命名空间。 b 因为它将默认命名空间声明为 xmlns='bar' 并且没有前缀。 cf 因为它们没有前缀并从其父级继承默认命名空间。

      • d 属于 baz 命名空间,因为 x 前缀明确限定了它,但它的非限定内容 (e) 现在不属于任何命名空间,因为 xmlns=''

      • e 声明了 asdf 命名空间并将其分配给 y 前缀,但没有元素或属性使用它。

      • f 使用不同的命名空间 bar 重新声明 x 属性,如果有任何前缀,则将应用于 f 的任何前缀子级(如果前缀为 @,则应用于 f 987654352@)。

      • a 中的foo 属性属于foo 命名空间,因为它由x 前缀限定。

      • b 中的y 属性不属于任何命名空间,因为它没有前缀。

      查看@MichaelKay 的另一个答案,该答案链接到关于该主题的非常好的教程。

      【讨论】: