我在google.groups的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,还是这真的是一个错误?
答案 0 :(得分:1)
是的,您以错误的方式使用jSoup库。让我们一行一行:
您正在保存第一个孩子的参考资料:
Element div = body.select("div").first();
您要移除所有元素的子节点:
body.empty();
然后您尝试追加已删除的子项:
body.appendChild(div);
现在问题出在最后一步,因为当你删除了所有的子元素时,那时父子关系没有被破坏,因为body.empty();
只调用了clear();
方法java.util.List
1}}并且它不会破坏任何父子链接,当你执行body.children().remove()
时就不是这种情况了,这就是为什么在下面的代码中你得到了提到的异常,因为存在对子节点的悬空引用: / p>
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);