如何遍历 ORDERED_NODE_SNAPSHOT_TYPE 类型的 javascript XPathResult

kal*_*nma 4 javascript xpath

我需要使用 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);
}
Run Code Online (Sandbox Code Playgroud)

当然,我发现第一个节点一被克隆,迭代器就失效了,因为 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);
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为 XPathResult 对象没有长度属性。我也试过 subcat_child_nodes.forEach() 并且没有用,也没有 iterateNext()。

如何以允许我克隆每个节点的方式遍历 ORDERED_NODE_SNAPSHOT_TYPE 类型的 XPathResult?如果这是不可能的,有没有办法克隆作为节点列表的整个 XPathResult ?

kal*_*nma 5

因此,以防万一其他人正在寻找我上述问题的答案,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);
}
Run Code Online (Sandbox Code Playgroud)