2012-01-13 3 views
0

Я отправил это на группе Jsoup в google.groups, но не кажется, что будет много активности там в последнее время, так что я постараюсь здесь также ...jsoup ошибка в Element.empty()

следующий код

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

Кроме того, можно также назвать клоном() на сНу Element –