Element.empty()中的jsoup错误

时间:2012-01-13 23:42:19

标签: exception jsoup

我在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,还是这真的是一个错误?

1 个答案:

答案 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);