我通过下面的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);
}
答案 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));
}
}