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

时间:2018-01-03 21:51:26

标签: java jsoup

我有HTML字符串,想要获得最后的结束标记。 e.g。

   -(void)viewDidLayoutSubviews
   {
      if(once){

      _myTableView.translatesAutoresizingMaskIntoConstraints = NO;

      NSLayoutConstraint *con1 = [NSLayoutConstraint 
      constraintWithItem:_myTableView attribute:NSLayoutAttributeTop 
      relatedBy:NSLayoutRelationEqual toItem:self.bottomElement 
      attribute:NSLayoutAttributeBottom multiplier:1 constant:12];

     NSLayoutConstraint *con2 = [NSLayoutConstraint 
     constraintWithItem:_myTableView attribute:NSLayoutAttributeTrailing 
     relatedBy:NSLayoutRelationEqual toItem:self.scrollView  
     attribute:NSLayoutAttributeTrailing multiplier:1 constant:0];

      NSLayoutConstraint *con3 = [NSLayoutConstraint 
      constraintWithItem:_myTableView attribute:NSLayoutAttributeLeading
      relatedBy:NSLayoutRelationEqual toItem:self.scrollView  
      attribute:NSLayoutAttributeLeading multiplier:1 constant:0];

      NSLayoutConstraint *con4 = [NSLayoutConstraint 
      constraintWithItem:_myTableView attribute:NSLayoutAttributeBottom 
      relatedBy:NSLayoutRelationEqual toItem:self.scrollView  
      attribute:NSLayoutAttributeBottom multiplier:1 constant:0];

      [self.scrollView  addConstraints:@[con1,con2,con3,con4]];

      [self.view layoutIfNeeded];

      once = NO;

      }

   }

我想在<h1> <p>some text</p> <p> <ol> <li>item1Text</li> <ol> </p> </h1> 之后插入一个按钮,因此我需要找到 html字符串中的最后一个标签,在这种情况下是item1Text

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

2 个答案:

答案 0 :(得分:1)

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

我建议您只在每行中只有一个开始和结束元素标记时才能使用的算法。例如,它不会返回正确答案:

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

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

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

    2.1。检查您是否找到了元素的起始标记==&gt;计数器++,

    2.2。检查此行是否还包含其结束标记==&gt;计数器 - 1

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

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

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

答案 1 :(得分:1)

  

是否有任何简单有效的方法可以在任何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代码。

<强> CODE

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>