为什么XPath元素继承了默认命名空间,但属性却没有?

时间:2016-09-28 18:20:26

标签: .net xml xpath

我有一个带有默认命名空间的XML文档。直到我发现我必须将名称空间映射到前缀(例如/someroot/somechild)并使用该前缀x,我才能像/x:someroot/x:somechild那样对其进行XPath查询。这一切都很好,直到我想查询具有某些属性的元素,在这种情况下/x:someroot/x:somechild[@x:someattribute]不起作用,但/x:someroot/x:somechild[@someattribute]会起作用。由于XML文档中没有定义名称空间前缀,我希望每个节点,元素,属性或其他方式都可以继承默认名称空间。相反,似乎元素继承了默认命名空间,但属性却没有。当然,我对XML的理解非常有限,所以我错过了什么?

我使用.NET XmlDocument对象作为我的文档来查询,XmlNamespaceManager对象将文档的默认命名空间映射到前缀,并使用SelectSingleNode(String, XmlNamespaceManager)方法查询文件。

1 个答案:

答案 0 :(得分:4)

这就是命名空间规范对此事所说的话:

  

默认名称空间声明不直接应用于属性   名称;对无前缀属性的解释由   它们出现的元素。

没有理由说明为什么规范的作者做出了这个决定。

有人指出,这种说法实际上非常模糊。例如,它并没有说没有前缀的属性没有命名空间,也没有说它们与包含元素在同一个命名空间中,但是可以合理地采用这两种解释。对于明确的声明,您必须查看明确说明的XPath 1.0规范:

  

如果QName为,则属性名称的名称空间URI将为null   该属性没有前缀。

同样,没有给出任何理由(除非编辑认为有必要为自己辩护,否则规范提供理由是不常见的)。但XPath 1.0规范的编辑是James Clark,James Clark在这里编写了一个教程

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

总结了他对命名空间的思考的线索;但这个特定决定没有理由,他只是重申:

  

请注意,xmlns属性不会影响未加前缀的属性   名。