2016-09-28 62 views
0

我有一个默认名称空间的XML文档。直到我发现我不得不将名称空间映射到前缀(例如x),并使用该前缀/x:someroot/x:somechild之前,我无法像XPath那样在其上查询/someroot/somechild。这一切都很好,直到我想查询具有某个属性的元素,在这种情况下/x:someroot/x:somechild[@x:someattribute]不起作用,但是/x:someroot/x:somechild[@someattribute]的确如此。没有在XML文档中定义的名称空间前缀,我希望每个节点,元素,属性或其他名称都继承默认名称空间。看来,元素已经继承了默认的命名空间,但属性没有。当然,我对XML的理解是非常有限的,所以我错过了什么?为什么XPath元素继承默认名称空间,但属性不会?

我使用的是.NET XmlDocument对象作为我的文档来查询,一个XmlNamespaceManager对象到文档的默认名称空间映射到一个前缀,而SelectSingleNode(String, XmlNamespaceManager)方法对文档进行查询。

+0

的可能的复制[XML默认命名为不合格的属性名称?](http://stackoverflow.com/questions/3312390/xml-default-namespaces-for-unqualified-attribute-names) –

+1

当你问“为什么?“,你期待什么样的答案?你想知道XML名称空间工作组成员在做出设计决定时给出的基本原理吗?或者你想要某种第三方的理由,为什么这可能是一个合理的决定?或者你只是想要一个指向规范中规则的指针,是的,这是它的工作方式? –

+0

是一个dup,但我得到了我喜欢的答案。你会推荐我做什么? –

回答

4

这就是命名空间规范必须对此事说:

默认命名空间声明并不直接适用于属性 名称;前缀属性的解释由它们出现的元素决定。

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

有人指出,这种说法其实很模糊。例如,它没有说没有前缀的属性不在名称空间中,并且没有说它们与包含的元素在同一个名称空间中,但是两种解释都可以合理地采用。对于一个明确的说法,你要看看XPath 1.0规范该条规定明确:

命名空间属性的名称的URI将是无效的,如果在 qname的属性没有前缀。

此外,没有给出任何基本原理(除非编辑们强烈需要证明自己的理由,否则规范不会给出理由)。但的XPath 1.0规范的编辑是詹姆斯·克拉克,詹姆斯·克拉克写在这里的教程

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

这给线索,他对一般的命名空间思维;但没有理由为这个特别的决定,他只是重申:

请注意,xmlns属性不影响前缀名称 名称。

相关问题