如果您想处理多个结果,请不要调用.snapshotItem(0)
on document.evaluate()
而是使用循环遍历结果for
循环和snapshotLength()
:
示例:使用循环遍历结果snapshotLength()
with snapshotItem()
var nodesSnapshot = document.evaluate('//*[contains(text(),"@")]',
document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
for ( var i=0 ; i < nodesSnapshot.snapshotLength; i++ )
{
console.dir( nodesSnapshot.snapshotItem(i) );
}
要么这样,要么指定XPathResult.UNORDERED_NODE_ITERATOR_TYPE
论证(而不是XPathResult.ORDERED_NODE_SNAPSHOT_TYPE
),并使用while
循环与iterateNext()
:
示例:使用迭代结果iterateNext()
var iterator = document.evaluate('//*[contains(text(),"@")]',
document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null );
try {
var thisNode = iterator.iterateNext();
while (thisNode) {
console.dir( thisNode );
thisNode = iterator.iterateNext();
}
}
catch (e) {
console.log( 'Error: Document tree modified during iteration ' + e );
}
在与这个问题中的情况有点相反的情况下,当你真的do只想获取第一个匹配节点 - 您可以指定XPathResult.FIRST_ORDERED_NODE_TYPE
值,仅返回单个节点,然后使用属性(而不是方法)singleNodeValue
:
示例:使用XPathResult.FIRST_ORDERED_NODE_TYPE
and singleNodeValue
var firstMatchingNode = document.evaluate('// [contains(text(),"@")]',
document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null );
console.dir( firstMatchingNode.singleNodeValue );
改为获取文本或倒数,或测试真/假条件
注意在其他值(常量)中,您可以指定为倒数第二个参数document.evaluate() https://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript#XPathResult_Defined_Constants要获取其他结果类型,可以使其直接返回:
- 单个字符串 (
XPathResult.STRING_TYPE
)从文档的某些部分中窃取
- 代表某种计数的数字
(
XPathResult.NUMBER_TYPE
);例如,计数
文档中找到的电子邮件地址
- 一个布尔值(
XPathResult.BOOLEAN_TYPE
) 代表文档的某些真/假方面;例如,指示文档是否包含任何电子邮件地址
当然,要获取其他结果类型,您提供的 XPath 表达式作为第一个参数document.evaluate()
需要是一个实际返回字符串、数字或布尔值的表达式(而不是返回一组属性节点或元素节点)。
更多内容请参见 MDN
上面的例子都是基于MDN在 JavaScript 中使用 XPath 简介 https://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript教程,强烈推荐给任何尝试使用 XPath 和document.evaluate()
.