簡體   English   中英

Jsoup在遍歷時刪除節點和子節點

[英]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時刪除節點及其子節點?

刪除headtail節點將無法可靠地工作(實際上它似乎取決於您刪除的節點)。 您可以簡單地存儲對要刪除的節點的引用,然后再處理它們,而不是在遍歷時刪除。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM