2016-04-14 15 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

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

上記のサンプルでは、​​すべての非ルートノードを削除しても、動作するはずです。

+0

はい、これは実際に私が最後にやったことです... – houcros

0

ちょうど推測:トラバースメソッドの終わりにノードを削除しようとします。または、トラバースを取り外すたびにトラバースを再開します。

関連する問題