2016-04-14 14 views
3

Ich versuche, die Knoten eines DOM mit Jsoup zu durchlaufen, und einige Knoten und seine untergeordneten Elemente zu entfernen, wenn eine Bedingung erfüllt ist. Allerdings bekomme ich dabei eine java.lang.NullPointerException Ausnahme. Ich habe so etwas wie:Jsoup Knoten und untergeordnete Elemente entfernen, während Sie durchlaufen

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) { 

    } 
}); 

Irgendwie macht es Sinn, dass es mich nicht Knoten entfernen, während auf sie laufen, aber was wäre der Weg, dies dann zu erreichen? Entfernen Sie einen Knoten und seine untergeordneten Elemente, während Sie das DOM durchlaufen?

Antwort

2

Das Entfernen von Knoten in head oder tail funktioniert nicht zuverlässig (tatsächlich hängt es davon ab, welche Knoten Sie entfernen). Anstatt während des Traversierens zu entfernen, können Sie einfach Referenzen auf die Knoten speichern, die Sie entfernen möchten, und sie anschließend verarbeiten.

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

Die Probe oben sollte funktionieren, auch wenn Sie alle nicht-root Knoten entfernen.

+0

Ja, das ist tatsächlich, was ich am Ende getan habe ... – houcros

0

nur Raten: Versuchen Sie, den Knoten am Ende der Traverse-Methode zu entfernen. Oder starten Sie den Polygonzug jedes Mal neu, wenn Sie ihn entfernen.

Verwandte Themen