【问题标题】: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
【解决方案2】:
这里有一个简短的总结。
当您使用xmlns 而不声明前缀时,它声明的命名空间将被该范围内的所有元素(您声明它的元素以及它包含的所有无前缀元素)继承,直到声明另一个具有不同值的xmlns)。
属性不继承命名空间。它们必须带有前缀。
当您使用xmlns:prefix 时,它声明的命名空间将被该范围内的所有前缀元素(您声明它的前缀元素及其包含的所有前缀元素,直到另一个具有不同值的xmlns:prefix 被声明)。如果声明它的元素没有相同的前缀,或者没有前缀,它就不会成为命名空间的一部分。
基于此,在您的示例中:
a 和 e 不属于任何命名空间。 a 因为它没有 xmlns 声明,也没有父母。 e 因为它的父级有一个 xmlns='' 属性,这使得默认命名空间为空。
b、c 和 f 属于 bar 命名空间。 b 因为它将默认命名空间声明为 xmlns='bar' 并且没有前缀。 c 和 f 因为它们没有前缀并从其父级继承默认命名空间。
d 属于 baz 命名空间,因为 x 前缀明确限定了它,但它的非限定内容 (e) 现在不属于任何命名空间,因为 xmlns=''。
e 声明了 asdf 命名空间并将其分配给 y 前缀,但没有元素或属性使用它。
f 使用不同的命名空间 bar 重新声明 x 属性,如果有任何前缀,则将应用于 f 的任何前缀子级(如果前缀为 @,则应用于 f 987654352@)。
a 中的foo 属性属于foo 命名空间,因为它由x 前缀限定。
b 中的y 属性不属于任何命名空间,因为它没有前缀。
查看@MichaelKay 的另一个答案,该答案链接到关于该主题的非常好的教程。