📜  遍历 NodeList 时移除 DOM 节点 - Java (1)

📅  最后修改于: 2023-12-03 14:58:08.867000             🧑  作者: Mango

遍历 NodeList 时移除 DOM 节点 - Java

在 Java 中使用 NodeList 遍历 HTML 时,有时需要在遍历的过程中移除某些节点。然而,直接在遍历中移除节点会导致 NodeList 指向的节点集合发生变化,可能会导致遍历出现意外结果或抛出异常。本文将介绍如何安全地遍历 NodeList 并移除其中的节点。

NodeList

在 Java 中,可以使用 org.w3c.dom 包中的 NodeList 来遍历 XML 或 HTML 文档中的节点。NodeList 是一种动态集合,可以通过它的 item(int index) 方法按索引获取节点对象。

Document doc = ...
NodeList nodeList = doc.getElementsByTagName("div");
for (int i = 0; i < nodeList.getLength(); i++) {
    Node node = nodeList.item(i);
    // ...
}
移除节点方法

在遍历 NodeList 时,如果需要移除某些节点,一种安全的方法是将需要移除的节点放在另一个集合中,并在遍历结束后再遍历这个集合,依次将节点从原来的树结构中移除。

NodeList nodeList = doc.getElementsByTagName("div");
List<Node> nodesToRemove = new ArrayList<>();
for (int i = 0; i < nodeList.getLength(); i++) {
    Node node = nodeList.item(i);
    // ...
    if (shouldRemoveNode(node)) {
        nodesToRemove.add(node);
    }
}
for (Node nodeToRemove : nodesToRemove) {
    nodeToRemove.getParentNode().removeChild(nodeToRemove);
}

private boolean shouldRemoveNode(Node node) {
    // ...
}

注意,移除节点后 NodeList 的长度会发生变化,因此在遍历集合时仍要使用 nodeList.getLength() 来获取长度。

参考资料
  • https://docs.oracle.com/javase/tutorial/jaxp/dom/readingXML.html