我的xpath查询没有找到任何结果

时间:2012-12-03 15:18:20

标签: xml xpath xml-parsing

我有一个简单的xml节点和一个同样简单的xpath查询表达式,但它无法正常工作。我已经尝试了各种各样的变体(// node-name,* [name()='node-name'],current-node-name / node-name),但它仍然没有找到正确的节点!

这是我的xml:

<page-reference xmlns="http://something.com">
  <relative-path>something/something</relative-path>
  <base-path>somePath</base-path>
</page-reference>

我尝试了一些不同的x路径变体。如果我取出page-reference标记的xmlns属性,它们中的大多数都可以工作。例如://relative-path, /page-reference/relative-path, relative-path, page-reference/relative-path,但它们都不适用于xmlns属性。

任何可能导致这种情况的想法?我认为它是值中的http之后的双斜线,但我不知道为什么会导致问题,而且似乎也不是这样。

3 个答案:

答案 0 :(得分:2)

xmlns属性为元素提供了命名空间,这意味着它不仅仅是一个普通的“页面引用”或“相对路径”元素,因此无法像这样访问它。不同的语言有不同的方式来指示命名空间,从指示XPath查询的默认值到使用前缀。

对于JavaScript,您可以使用名称空间解析程序:https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#Implementing_a_User_Defined_Namespace_Resolver(如果要指定前缀 - 当文档中使用不同的名称空间时很有用)和/或依赖于XPath表达式中的默认名称空间(虽然你需要使用一些 - ANY - 前缀):https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#Implementing_a_default_namespace_for_XML_documents

var xml = new DOMParser().parseFromString('<page-reference xmlns="http://something.com">'+
  '<relative-path>something/something</relative-path>'+
  '<base-path>somePath</base-path>'+
'</page-reference>', 'text/xml');

function resolver() {
    return 'http://something.com';
}
var refs = xml.evaluate('//x:page-reference', xml, resolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
alert(refs.snapshotItem(0).nodeName) // 'page-reference'

你需要一个垫片来支持IE。 (快速搜索http://sourceforge.net/projects/js-xpath/files/js-xpath/

答案 1 :(得分:2)

或者,您可以使用

//*[name()='relative-path']

答案 2 :(得分:1)

XPath不知道“默认”XML命名空间(xmlns)。因此,您需要在XPath表达式中将所有节点作为页面引用标记的命名空间的前缀。

XML:

<page-reference xmlns:s="http://something.com">
  <relative-path>something/something</relative-path>
  <base-path>somePath</base-path>
</page-reference>

的XPath:

//s:relative-path
相关问题