繁体   English   中英

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

[英]How should I handle removed elements in JSoup?

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

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

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

}

在这样做时,我不断

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

到目前为止,我已经检查了各种空条件,例如if(d!= null)等,但是似乎没有一个有效。 您能否提出解决方案?

更新:假设我有两个循环,其中在满足条件时要删除Elements。 下面的代码仅作为示例,请不要为此提出解决方法,例如在第一个条件下中断循环等,我需要在逻辑层面上理解它。

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.

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

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

如果您只想从身体上去除东西,建议您使用

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

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

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

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();
            }
        }
    }
}

从jsoup文档中删除任何元素后,其引用将变为null。 因此,无论您在何处使用“删除”,都必须进行空检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM