【问题标题】:Selecting children nodes选择子节点
【发布时间】:2014-04-21 10:17:27
【问题描述】:

如何选择以下元素以插入新元素?

注意:假设嵌套表的

和 有效并插入
 标记。

<html>
  <body>
    <table>
      <tbody>
        ....more elements here...
        <table>
          <tbody> <----- how do I select this?

          </tbody>
        </table>
      </tbody>
    </table>
  <body>
</html>

以下选择不起作用?

// This isn't selecting the node correctly?
Element tablebody = doc.body().select("table  > tbody > table > tbody").first();

Element pre = tablebody.appendElement("pre");
pre.text("hello");

【问题讨论】:

  • "假定有效的 和 [...] 插入
     标记。"鉴于您的代码,这显然是不可能的。您的代码清楚地显示在 tbody 元素中插入 pre。你不能只是在纸上做出假设,然后假装你的代码会根据这些假设工作(除非 jsoup 知道如何自己解决它)。
                    
                  
                    
                            
                
            
        
    
                
    

标签: dom css-selectors jsoup


【解决方案1】:

这不是有效的标记。 table 不能直接存在于 tbody 中。

如果您的内表不在tr &gt; td 中,则该内表实际上被构造为外表的下一个兄弟。换句话说,您实际上根本没有内部表。

除非可以更正标记,否则您必须将该“内表”视为以下兄弟:

Element tablebody = doc.body().select("table + table > tbody").first();

如果您可以更正标记,则可以使用缺少的 trtd 位来完成选择器:

Element tablebody = doc.body().select("table > tbody > tr > td > table > tbody").first();

或者简单地将其中一个子选择器替换为后代选择器:

Element tablebody = doc.body().select("table > tbody table > tbody").first();

此外,tbody 只能将 tr 元素作为子元素。您不能按照您尝试的方式在 tbody 内附加 pre 元素。您可能希望在 that tbody 中选择第一个 tr &gt; td 并将其附加到那里。

【讨论】:

  • 感谢您的精彩总结。 .select("表格 > tbody 表格 > tbody").first();完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多