Javascript:在元素中查找xpath

Javascript:在元素中查找xpath,javascript,dom,Javascript,Dom,我通过下面的xpath获取所有元素。我想查看每个TD,并在每个TD中搜索另一个xpath。我不确定下面的方法是否有效,但这是我想要实现的。我知道您可以//td//a,但我想知道如何以编程方式搜索每个元素以获得更多XPath var tds = document.evaluate('//td', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (++index < tds.snapshotLength

我通过下面的xpath获取所有元素。我想查看每个TD,并在每个TD中搜索另一个xpath。我不确定下面的方法是否有效,但这是我想要实现的。我知道您可以//td//a,但我想知道如何以编程方式搜索每个元素以获得更多XPath

 var tds = document.evaluate('//td', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

 for (++index < tds.snapshotLength){
  //this link may or may not exist
  var link = document.evaluate('//a', tds[index].document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
 }
var tds=document.evaluate('//td',document,null,XPathResult.ORDERED\u NODE\u SNAPSHOT\u TYPE,null);
对于(++索引
您的方法看起来不错,但是您的
for
语法不正确,您需要使用
快照项来访问tds的结果:

var tds = document.evaluate('//td', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

var i;
for (i=0; i < tds.snapshotLength; i++) {
     var link = document.evaluate('//a', tds.snapshotItem(i), null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
     if(link.snapshotLength) {
         console.log(link.snapshotItem(0));
     }
}
var tds=document.evaluate('//td',document,null,XPathResult.ORDERED\u NODE\u SNAPSHOT\u TYPE,null);
var i;
对于(i=0;i

定义两个助手函数是明智的,它们完成繁重的工作并返回易于使用的结果:

function selectNodes(path, contextNode) {
    var result, item, nodes = [];

    result = document.evaluate(path, contextNode || document, null, 
      XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

    while ( item = result.iterateNext() ) nodes.push(item);

    return nodes;
}

function selectSingleNode(path, contextNode) {
    return selectNodes(path, contextNode)[0];
}
现在使用XPath变得很简单:

var tds = selectNodes('//td'), i, a;

for (i = 0; i < tds.length; i++) {
    a = selectSingleNode('.//a', tds[i]);
    console.log(a.href);
}
var-tds=selectNodes('//td'),i,a;
对于(i=0;i

注意相对路径(
。//a'
)。当您希望上下文节点的结果正确时,需要使用相对路径-普通的
/
总是从文档根开始。

是的,我发现在xpath之前添加
,否则它不会在正确的上下文节点中查找。