[英]Jsoup remove node and children while traversing
我試圖用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時刪除節點及其子節點?
刪除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();
即使您刪除了所有非根節點 ,上面的示例也應該有效。
只是猜測:嘗試在遍歷方法結束時刪除節點。 或者,每次移除它時重新啟動遍歷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.