1

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

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 在内部检查元素是否不为空,如果是,则抛出异常。考虑场景:

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

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

4

3 回答 3

0

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

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

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

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

于 2013-06-18T13:15:07.633 回答
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();
            }
        }
    }
}
于 2019-10-11T05:42:56.790 回答
-1

一旦从 jsoup 文档中删除任何元素,它的引用就会变为空。因此,您必须在使用“删除”的任何地方进行空检查。

于 2018-10-12T08:11:02.347 回答