使用XPath在DOM中搜索相同字符串的倍数

时间:2015-09-08 21:57:12

标签: javascript dom xpath document.evaluate

我正在编写一个Chrome扩展程序,可以搜索DOM并突出显示页面上的所有电子邮件地址。我发现这可以查找页面上的符号,但只有在有一个电子邮件地址时它才能正确返回,当找到多个地址时,它会中断。

found = document.evaluate('//*[contains(text(),"@")]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);

如果找到多个,则返回倍数的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

如果您想要处理多个结果,请不要在.snapshotItem(0)上致电document.evaluate(),而是使用for循环和snapshotLength()循环显示结果:

示例:使用snapshotLength() 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 );
}

如果情况与此问题中的情况相反 - 当您真正执行只想获得第一个匹配节点时 - 您可以指定XPathResult.FIRST_ORDERED_NODE_TYPE值,只返回一个节点,然后使用属性(不是方法)singleNodeValue

示例:使用XPathResult.FIRST_ORDERED_NODE_TYPEsingleNodeValue
var firstMatchingNode = document.evaluate('// [contains(text(),"@")]',
    document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null );

console.dir( firstMatchingNode.singleNodeValue );

获取文本或计数,或测试真/假条件

注意among the other values (constants) you can specify as the second-to-last argument to document.evaluate()要获取其他结果类型,可以直接返回:

  • 从文档的某些部分中删除的单个字符串(XPathResult.STRING_TYPE
  • 表示某种计数的数字 (XPathResult.NUMBER_TYPE);例如,计数的数量 文件中的电子邮件地址
  • 表示文档的某些真/假方面的布尔值(XPathResult.BOOLEAN_TYPE);例如,指示文档是否包含任何电子邮件地址

当然为了获得那些其他结果类型,你给出的document.evaluate()的第一个参数的XPath表达式需要是一个实际返回字符串,数字或布尔值的表达式(而不是返回一组属性节点或元素节点。)

更多来自MDN

上面的示例都基于MDN Introduction to using XPath in JavaScript教程,强烈建议任何尝试使用XPath和document.evaluate()的人。