我有一个简单的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之后的双斜线,但我不知道为什么会导致问题,而且似乎也不是这样。
答案 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