我试图用Jsoup遍历DOM的节点,并在满足条件时删除一些节点及其子节点。但是,我这样做了java.lang.NullPointerException
例外。我有类似的东西:
File input = new File(inputPath);
Document doc = Jsoup.parse(input, "UTF-8");
doc.traverse(new NodeVisitor() {
@Override
public void head(Node node, int depth) {
switch (node.getClass().getName()){
case "org.jsoup.nodes.Element":
Element elem = (Element) node;
Map<String, String> dataset = elem.dataset();
for (String key : dataset.keySet()) {
.....
// Here is the problem
if (someCondition) node.remove()
}
break;
case "org.jsoup.nodes.TextNode":
....
break;
}
}
@Override
public void tail(Node node, int depth) {
}
});
不知怎的,它在迭代它们时不会让我删除节点是有道理的,但是实现这个目的的方法是什么呢?在遍历DOM时删除节点及其子节点?
答案 0 :(得分:2)
删除head
或tail
中的节点将无法可靠地工作(实际上它似乎取决于您删除的节点)。您可以简单地存储对要删除的节点的引用,然后在之后处理它们,而不是在遍历时删除。
List<Node> toRemove = new LinkedList<>();
doc.traverse(new NodeVisitor() {
@Override
public void head(Node node, int depth) {
// ...
if(condition)
toRemove.add(node);
}
// ...
});
for (Node node : toRemove)
node.remove();
即使您删除了所有非root 节点,上面的示例也应该有效。
答案 1 :(得分:0)
猜测:尝试在遍历方法结束时删除节点。或者,每次移除时都重新启动遍历。