Javascript:在元素中查找xpath

时间:2014-08-22 07:07:44

标签: 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){
  //this link may or may not exist
  var link = document.evaluate('//a', tds[index].document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
 }

2 个答案:

答案 0 :(得分:2)

明智的做法是定义两个辅助函数来完成繁重的工作并返回结果,这些函数很容易使用:

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);
}

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

答案 1 :(得分:0)

您的方法似乎很好,但您的for语法不正确,您需要使用snapshotItem来访问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));
     }
}

jsFiddle