首页 > 解决方案 > 方法后的 Jsoup 无法按预期方式工作

问题描述

我有一个具有“元素”类型的属性描述的方法,然后我尝试使用 Jsoup.after 方法添加另一个元素。

然而,它产生

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

另一方面,append 方法效果很好,但这不是我真正想要的。

代码如下:

private static void buildTotalvaluesTable2()
{
    Element readyDesc = new Element("p style=\"margin-top:5px\">This is description</p");

    Element totalValuesTable = new Element("table style=\"width:100%; border: 0px; margin-top:20px;\" class=\"hidden\">" +
            "<tbody></tbody>" +
            "</table");

    readyDesc.after(totalValuesTable.outerHtml());

    System.out.println(readyDesc.outerHtml());
}

我真正想要实现的只是在 readyDesc 之后的 totalValuesTable。

有人可以帮忙吗?

标签: javahtmljsoup

解决方案


b让我们首先解释将元素设置为元素的兄弟a(这里用 表示)是什么意思a.after(b)
简而言之,这意味着将元素放置b parent元素a旁边(之后)a元素的位置。

因此,在这一点上,我们可以看到您的代码的主要问题是它没有提供任何指向应该放置同级的元素的链接。

简单的解决方案是

  1. 创建ElementDocument代表父母,
  2. a元素分配为父元素的子元素
  3. (仅在 1. 2. 之后)将b元素指定为 的兄弟a

换句话说,类似:

Element parent = new Element("body");

Element a = ...
parent.appendChild(first); // create parent-child relation

Element b = ...
a.after(b);      // now `a` knows about its parent element so it knows 
                 // to which element append `b`

第二个问题是您没有new Element(...)正确使用

new Element("p style=\"margin-top:5px\">This is description</p");

该构造函数的目的不是创建和设置,而只是创建HTML 元素。应该稍后再定制那个元素。

换句话说,不要使用new Element("<tag with='attributes'>and other elements</tag>")butnew Element("tagName")并通过专用方法设置该元素,例如:

Element readyDesc = new Element("p");//use only name of tag, without < and >
System.out.println(readyDesc); //raw form: <p></p>

//customize tag
readyDesc.attr("style", "margin-top:5px");
readyDesc.text("This is description");
System.out.println(readyDesc);//customized: <p style="margin-top:5px">This is description</p>

推荐阅读