java - 方法后的 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。
有人可以帮忙吗?
解决方案
b
让我们首先解释将元素设置为元素的兄弟a
(这里用 表示)是什么意思a.after(b)
。
简而言之,这意味着将元素放置b
在parent
元素a
旁边(之后)a
元素的位置。
因此,在这一点上,我们可以看到您的代码的主要问题是它没有提供任何指向应该放置同级的父元素的链接。
简单的解决方案是
- 创建
Element
或Document
代表父母, - 将
a
元素分配为父元素的子元素 - (仅在 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>
推荐阅读
- qt5 - Windows 上的 KDE 框架部署
- javascript - 如何使用 date-fns 或 moment 来区分两个日期 ionic3
- vba - VBA,将工作表复制并粘贴到工作表,复制不需要的标题
- angular5 - Angular5表单数组验证动态创建的字段
- c++ - 应用观察者模式时发生错误
- javascript - 如何为一个对象显示部分单词一行,将鼠标指针移动到文本字段上显示全文
- python - Biopython 成对对齐在循环运行时导致分段错误
- android - 以编程方式切换 TargetActivity
- c++ - OpenGL:零活动制服
- laravel - 表单没有从 Laravel 的数组中获取变量