2016-04-14 57 views
3

我試圖用Jsoup遍歷DOM的節點,並在滿足條件時刪除一些節點及其子節點。不過,我這樣做的例外是java.lang.NullPointerException。我有類似:Jsoup在遍歷時刪除節點和子節點

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時移除節點及其子節點?

回答

2

刪除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(); 

樣品上方應該工作,即使你刪除所有非根節點。

+0

是的,這實際上是我最終做的最後... – houcros

0

只是猜測:嘗試在遍歷方法的末尾刪除節點。或者,每次刪除它時重新開始遍歷。