我有一个带有默认命名空间的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)
方法查询文件。
答案 0 :(得分:4)
这就是命名空间规范对此事所说的话:
默认名称空间声明不直接应用于属性 名称;对无前缀属性的解释由 它们出现的元素。
没有理由说明为什么规范的作者做出了这个决定。
有人指出,这种说法实际上非常模糊。例如,它并没有说没有前缀的属性没有命名空间,也没有说它们与包含元素在同一个命名空间中,但是可以合理地采用这两种解释。对于明确的声明,您必须查看明确说明的XPath 1.0规范:
如果QName为,则属性名称的名称空间URI将为null 该属性没有前缀。
同样,没有给出任何理由(除非编辑认为有必要为自己辩护,否则规范提供理由是不常见的)。但XPath 1.0规范的编辑是James Clark,James Clark在这里编写了一个教程
http://www.jclark.com/xml/xmlns.htm
总结了他对命名空间的思考的线索;但这个特定决定没有理由,他只是重申:
请注意,xmlns属性不会影响未加前缀的属性 名。