【问题标题】:How should I handle removed elements in JSoup?我应该如何处理 JSoup 中删除的元素?
【发布时间】:2019-10-11 13:42:56
【问题描述】:

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

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。是否可以从中获得布尔返回值?还有什么解决办法?

【问题讨论】:

  • 行是什么?显示完整的堆栈跟踪。
  • 是的,我已经检查过了,它是同一行,每当我尝试 d.(somemethod) 时,它都会抛出相同的异常,因为它已经在之前的某个循环中被删除了。
  • 提供更多代码。现在有点难以理解这个问题。

标签: java html jsoup


【解决方案1】:

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

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

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

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

【讨论】:

  • 请注意,问题在于两个不同条件的循环。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这是不正确的。元素引用在删除时不会更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多