3

我有一个简单的 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 之后的双斜杠,但我不知道为什么会导致问题,而且似乎也并非如此。

4

3 回答 3

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'

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

于 2012-12-03T15:23:59.227 回答
2

或者,您也可以使用

//*[name()='relative-path']
于 2012-12-03T15:28:55.633 回答
1

XPath 不知道“默认” XML 名称空间 (xmlns)。因此,您需要在 XPath 表达式中的所有节点前面加上 page-reference 标记的命名空间。

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
于 2012-12-03T15:24:32.520 回答