我需要使用javascript获取XPathResult并遍历它,克隆结果的每个节点。最初,我尝试了以下结果,结果为ORDERED_NODE_ITERATOR_TYPE:
childNodesXPath = '//div[@id="'+subcat_id+'" and @parentid="'+subcat_parent_id+'"]';
subcat_child_nodes = document.evaluate(childNodesXPath, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
while (next_child_node = subcat_child_nodes.iterateNext()) {
new_child_node = next_child_node.cloneNode(true);
new_child_node.setAttribute('parentid', target_id);
new_child_node.setAttribute('grandparentid', target_parentid);
new_length = new_subcat_child_nodes.push(new_child_node);
}
当然我发现迭代器一旦克隆了第一个节点就变成了无效因为DOM发生了变化,所以我尝试了这个结果为ORDERED_NODE_SNAPSHOT_TYPE:
childNodesXPath = '//div[@id="'+subcat_id+'" and @parentid="'+subcat_parent_id+'"]';
subcat_child_nodes = document.evaluate(childNodesXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (i=0; i<subcat_child_nodes.length; i++) {
new_child_node = subcat_child_nodes[i].cloneNode(true);
new_child_node.setAttribute('parentid', target_id);
new_child_node.setAttribute('grandparentid', target_parentid);
new_length = new_subcat_child_nodes.push(new_child_node);
}
这不起作用,因为XPathResult对象没有length属性。我也尝试了subcat_child_nodes.forEach(),但是没有工作,也没有迭代到Next()。
如何以允许我克隆每个节点的方式迭代ORDERED_NODE_SNAPSHOT_TYPE类型的XPathResult?如果那是不可能的,有没有办法克隆整个XPathResult是一个节点列表?
答案 0 :(得分:0)
所以,以防万一其他人正在寻找上述问题的答案,Jaromanda在评论中的答案向我指出了参考资源,这就是我最终使用的内容。
subcat_child_nodes = document.evaluate(childNodesXPath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (i=0; i<subcat_child_nodes.snapshotLength; i++) {
new_child_node = subcat_child_nodes.snapshotItem(i).cloneNode(true);
new_child_node.setAttribute('parentid', target_id);
new_child_node.setAttribute('grandparentid', target_parentid);
new_length = new_subcat_child_nodes.push(new_child_node);
}