如何使用 Jsoup 从 html 字符串中找到最后一个节点?



我有HTML字符串,想要获取最后的结束标签。 例如

<h1>
<p>some text</p>
<p>
<ol>
<li>item1Text</li>
<ol>
</p>
</h1>

我想在item1Text后插入一个按钮,因此我需要找到 HTML 字符串中的最后一个标记,在本例中为</li><ol></p></h1>

问题 ->是否有任何简单有效的方法来获取任何给定 HTML 字符串中的最后一个标签

如果我理解正确的话,你在字符串中有一些HTML"代码",你想用Java处理它。 我假设您知道元素的开始标签在哪里,并且您想在结束标签之后插入按钮。

我建议您的算法仅在每行中不超过一个开始和结束元素标签时才有效。 例如,它不会返回以下方面的正确答案:

<p>
<ol><li>item1Text</li><ol> // more than one opening and closing element tags
</p>

我的解决方案涉及使用堆栈来匹配开始和结束标签。 它假定您已经将 HTML 拆分为几行。

  1. 将计数器设置为 1
  2. 迭代线条。 对于每行:

    2.1. 检查是否找到元素的起始标签 ==> 计数器++,

    2.2. 检查此行是否也包含他的结束标签 ==>计数器--1。

    2.3. 检查计数器值是否为 0,如果是,则找到元素关闭的行。 否则,移至下一行。

在 Java 代码中,它看起来像这样:

if (line.matches("^(.*(<)(?!/).*)$")) {`
counter++;
}
if (line.matches("^(.*(</).*)$")) {`
counter--;
}
if(counter == 0) {
// done searching for the closing tag
}

是否有任何简单有效的方法来获取任何给定HTML字符串中的最后一个标签

您想要使用 CSS 查询。但是,您必须知道给定 HTML 字符串的结构或使用通用 CSS 查询。

如果可以添加有关 HTML 字符串的更多信息,则可能会提供一些指针。


下面是一个使用您帖子中的 HTML 片段的 CSS 查询示例。

li:contains(item1Text):last-of-type
li                    /* Select any LI element... */
:contains(item1Text)  /* containing 'item1Text' ... */
:last-of-type         /* and keep only the last LI. */

下面是一个带有上述 CSS 查询的示例 Java 代码。

法典

String htmlFragment="<h1>n <p>some text</p>n<p>n <ol>n <li>item1Text</li>n <ol>n</p>n</h1>";
System.out.println("BEFORE:n" + htmlFragment);
Document parsedHtmlFragment = Jsoup.parse(htmlFragment);
Elements matchingLIs = parsedHtmlFragment.select("li:contains(item1Text):last-of-type");
for(Element matchingLI : matchingLIs) {
// Append the button code at the end of the LI content.
matchingLI.append("<button type="button">BUTTON CONTENT HERE...</button>");
}
System.out.println("nAFTER:n" + parsedHtmlFragment.outerHtml());

输出

BEFORE:
<h1>
<p>some text</p>
<p>
<ol>
<li>item1Text</li>
<ol>
</p>
</h1>
AFTER:
<html>
<head></head>
<body>
<h1> <p>some text</p> <p> </p>
<ol> 
<li>item1Text<button type="button">BUTTON CONTENT HERE...</button></li> 
<ol> 
<p></p> 
</ol>
</ol></h1>
</body>
</html>

最新更新