2012-01-13 49 views
0

我在google.groups上發佈了這個Jsoup組,但是最近似乎沒有太多活動,所以我也會在這裏嘗試...Element.empty()中的jsoup錯誤

下面的代碼

final String html = "<html><head></head><body><div></div></body></html>"; 
Document doc = Jsoup.parse(html); 
Element body = doc.body(); 
Element div = body.select("div").first(); 
body.empty();     // <--- gives exception at line 56 below 
// body.children().remove(); // does not give exception 
body.appendChild(div);   // line 56, IndexOutOfBoundsException here 

與Jsoup 1.6.1,給我一個IndexOutOfBoundsException異常具有以下(部分,頂部7行)堆棧跟蹤

at java.util.ArrayList.RangeCheck(ArrayList.java:547) 
at java.util.ArrayList.remove(ArrayList.java:387) 
at org.jsoup.nodes.Node.removeChild(Node.java:394) 
at org.jsoup.nodes.Node.reparentChild(Node.java:420) 
at org.jsoup.nodes.Node.addChildren(Node.java:402) 
at org.jsoup.nodes.Element.appendChild(Element.java:225) 
at webfilter.FilterY.<init>(FilterY.java:56) 

這裏FilterY是我的含有上面的代碼類。如果我使用body.children()。remove()而不是body.empty(),它可以正常工作。

問題是......我濫用Jsoup在這裏,還是這真的是一個錯誤?

回答

1

是的,你是以錯誤的方式使用jSoup庫。

您保存的第一個孩子一個參考:

Element div = body.select("div").first(); 

您要刪除所有元素的子節點:

body.empty(); 
一行讓走線

然後你試圖追加t他刪除的子:

body.appendChild(div); 

現在的問題是,因爲當你刪除了所有的子元素,然後在那個時候的親子關係不打破,因爲body.empty();只是調用的的clear();方法的最後一步java.util.List並且它不會破壞任何親子聯動,當你做body.children().remove(),這就是爲什麼在下面的代碼,因爲有叼着參考子節點你所得到的提到的例外是不是這樣的:

protected void removeChild(Node out) { 
     Validate.isTrue(out.parentNode == this); 
     int index = out.siblingIndex(); 
     childNodes.remove(index); // problem comes here 
     reindexChildren(); 
     out.parentNode = null; 
    } 

,如果你做這樣的事情,然後它會工作:

Element div_child = doc.createElement("div"); 
body.appendChild(div_child); 
+0

此外,您還可以在div元素調用clone() – 2013-09-15 15:38:26