带有 dom 文档的 xpath

Posted

技术标签:

【中文标题】带有 dom 文档的 xpath【英文标题】:xpath with dom document 【发布时间】:2011-04-05 12:35:56 【问题描述】:

我正在尝试使用 xpath 查询查找 xml 节点。但我不能让它工作。在 firefox 中,结果总是“未定义”,chrome 会抛出错误代码。

<script type="text/javascript">

var xmlString = '<form><name>test</name></form>';
var doc = new DOMParser().parseFromString(xmlString,'text/xml');

var result = doc.evaluate('/form/name', doc, 
                          null, XPathResult.ANY_TYPE, null);

alert(result.stringValue);

</script>

这段代码有什么问题?

【问题讨论】:

【参考方案1】:

我不知道您为什么会收到此错误,但您可以将 XPathResult.ANY_TYPE 更改为 XPathResult.STRING_TYPE 并且可以正常工作(在 firefox 3.6 中测试)。

见:

var xmlString = '<form><name>test</name></form>';
var doc = new DOMParser().parseFromString(xmlString,'text/xml');
var result = doc.evaluate('/form/name', doc, null, XPathResult.STRING_TYPE, null);
alert(result.stringValue); // returns 'test'

见jsfiddle。


详情:

方法evaluate的第4个参数是一个整数,你可以指定你需要什么样的结果(reference)。有很多types,如整数、字符串和任何类型。这个方法返回一个XPathResult,它有很多属性。

您必须将属性 (numberValue, stringValue) 与评估中使用的属性匹配。

我只是不明白为什么 any type 不能与 string value 一起使用。

【讨论】:

【参考方案2】:

XPathResult.ANY_TYPE 将返回一个用于 xpath 表达式 /form/name 的节点集,因此 result.stringValue 将无法将节点集转换为字符串。在这种情况下,您可以使用result.iterateNext().textContent

但是,像 count(/form/name) 这样的表达式在与 XPathResult.ANY_TYPE 一起使用时会返回一个数字值,在这种情况下您可以使用 result.numberValue 来检索该数字。

https://developer.mozilla.org/en/DOM/document.evaluate#Result_types有更详细的解释

【讨论】:

以上是关于带有 dom 文档的 xpath的主要内容,如果未能解决你的问题,请参考以下文章

XPath如何定位dom节点

Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

Java操作XML文件

笔记:XML-解析文档-XPath 定位信息

Java操作XML文件

Selenium-xpath详解