我该如何处理JSoup中删除的元素?

时间:2013-05-23 17:50:25

标签: java html jsoup

我正在开发一个需要从文档中删除Elements的应用程序。

for(Element d : doc.getAllElements()){

if(condition){
 d.getAllElements().remove();
 }

}

关于这样做,我一直在

Exception in thread "main" java.lang.IllegalArgumentException: Object must not be null

到目前为止,我已经检查过各种null条件,比如if(d!= null)等,但似乎都没有。能否请您说明解决方案应该是什么?

更新: 假设我有两个循环,我在满足条件时删除元素。 下面的代码就是例如,请不要就此建议解决方法,比如在第一个条件下打破循环等,我需要在逻辑层面理解它。

for(Element e: doc.getAllElements()){

if(condition1 == true)
{
e.getAllElements().remove();

}


if(condition2 == true){

e.getAllElements().remove();

}


}

如果两个条件都满足,则元素在第一个循环中被删除,而当它达到第二个条件时,它会抛出非法异常。我试图评估问题,发现JSoup内部检查元素是否为null,如果是,则抛出异常。考虑一下场景:

if(e != null) // e is an Element.

在上面的空检查中,JSoup检查e的存在,在这种情况下是空的,因此在进入下一个单词之前是异常!= null。我检查了文档,发现有一个方法存在Validation.notNull(Element),但它返回void。是否有可能从此获得布尔返回值?还有什么解决方案?

3 个答案:

答案 0 :(得分:0)

如果检查doc.getAllElements()的结果,您将看到第一个元素是整个文档,因为从技术上讲,<html></html>是单个元素。如果您尝试.remove()此元素,它没有父元素,因此当它尝试验证父元素是否存在时,您会收到此null错误。

如果您只想从身体中移除物品,我建议使用

for(Element e: doc.select('body'))

或类似的,如果你不只是想要身体

答案 1 :(得分:0)

一旦从jsoup文档中删除了任何元素,那么它的引用将为null。因此,无论您在何处使用“删除”,都必须进行null检查。

答案 2 :(得分:0)

您必须检查元素是否仍然存在于文档内,然后将其删除。一对一删除元素:

for (Element element: doc.getAllElements()) {
    if(condition1 == true)
    {
        for (Element subElement: element.getAllElements()) {
            if (subElement.root() == doc) {
                subElement.remove();
            }
        }
    }
    if(condition2 == true)
    {
        for (Element subElement: element.getAllElements()) {
            if (subElement.root() == doc) {
                subElement.remove();
            }
        }
    }
}