📅  最后修改于: 2023-12-03 14:58:08.867000             🧑  作者: Mango
在 Java 中使用 NodeList 遍历 HTML 时,有时需要在遍历的过程中移除某些节点。然而,直接在遍历中移除节点会导致 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() 来获取长度。