我需要使用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(),但是它不起作用,也不是iterateNext()。

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

最佳答案

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

09-20 14:07