Java 如何将注释节点与Jsoup选择器api匹配?

Java 如何将注释节点与Jsoup选择器api匹配?,java,css,jsoup,Java,Css,Jsoup,下面是一个小的HTML代码: <ol class="annotations"> <!-- START ANNOTATIONS --> <li class="annotation"> Foo </li> <li class="annotation"> Bar </li> ... <!-- END ANNOTATIONS --> </ol> <ol

下面是一个小的HTML代码:

<ol class="annotations">
  <!-- START ANNOTATIONS -->
  <li class="annotation">
     Foo
  </li>
  <li class="annotation">
     Bar
  </li>
  ...
  <!-- END ANNOTATIONS -->
</ol>

<ol class="annotations">
  <li class="annotation">
     Baz
  </li>
  ...
</ol>
如何使用单个CSS查询实现这一点


Jsoup 1.8.2

简短回答:这是不可能的,因为注释不映射到Jsoup中的元素,而是在s上工作。但是,注释位于DOM树中,可以通过其名称属性进行标识:
node.nodeName().equals(“#comment”)
对于注释为true。当然,如果您想创建一个用注释标识节点的单行程序,这对您没有多大帮助。

简短回答:这是不可能的,因为注释不映射到Jsoup中的元素,而是在s上工作。但是,注释位于DOM树中,可以通过其名称属性进行标识:
node.nodeName().equals(“#comment”)
对于注释为true。当然,如果您想创建一个用注释标识节点的单行程序,这对您没有多大帮助

如何使用单个CSS查询实现这一点

不能,因为没有for注释节点

您目前的工作方式有几个问题:

  • HTML中有
    ol
    元素和类
    注释
    ,但代码使用的是
    ol.notes
    选择器

  • (这可能是问题,也可能不是问题,在快速测试中,它看起来像[对于我的测试,在我的文档上]JSoup修剪字符串。它可能不应该是,但是…)在第一次匹配时,您调用
    html()
    ,然后使用
    startsWith
    ——但是html可能以一些您不允许的空白开头

  • 除了正确的选择器之外,我可能会专门查找注释节点:

    Element firstMatch = findings().first();
    Node firstChild = firstMatch == null || firstMatch.childNodes().size() == 0 ? null : firstMatch.childNodes().first();
    if (firstChild != null && firstChild instanceof Comment && ((Comment)firstChild).getData().indexOf("START ANNOTATIONS") != -1) {
        // Yes, it's there
    }
    
    这只是一种拼凑,但你明白了。特别是第二行比我想的要尴尬一些,我非常惊讶地看到JSoup没有第一个孩子访问器。它是domapi的一个相当基本的部分,这使得这一行比它需要的更为笨拙

    如何使用单个CSS查询实现这一点

    不能,因为没有for注释节点

    您目前的工作方式有几个问题:

  • HTML中有
    ol
    元素和类
    注释
    ,但代码使用的是
    ol.notes
    选择器

  • (这可能是问题,也可能不是问题,在快速测试中,它看起来像[对于我的测试,在我的文档上]JSoup修剪字符串。它可能不应该是,但是…)在第一次匹配时,您调用
    html()
    ,然后使用
    startsWith
    ——但是html可能以一些您不允许的空白开头

  • 除了正确的选择器之外,我可能会专门查找注释节点:

    Element firstMatch = findings().first();
    Node firstChild = firstMatch == null || firstMatch.childNodes().size() == 0 ? null : firstMatch.childNodes().first();
    if (firstChild != null && firstChild instanceof Comment && ((Comment)firstChild).getData().indexOf("START ANNOTATIONS") != -1) {
        // Yes, it's there
    }
    

    这只是一种拼凑,但你明白了。特别是第二行比我想的要尴尬一些,我非常惊讶地看到JSoup没有第一个孩子访问器。它是DOM API的一个相当基本的部分,并且使这一行变得比它需要的更笨拙。

    您确定您使用了
    ol.notes
    ?@realpoint我的错误。我已经相应地更新了问题。你确定你使用了
    ol.notes
    ?@realpoint我的错误。我已经相应地更新了问题。我认为你的观点2。无效,因为html()是Jsoup的一个方法,不会返回原始html字符串,而是从解析的DOM生成的字符串。这意味着在第一个元素之前没有空格。@luksch:我必须测试它才能确定。看起来JSoup正在修剪字符串,但它可能不应该这样做。如果从HTML解析DOM,该HTML在
    ol
    的开始标记的
    之后和注释之前有空格,则该空格是
    ol
    中的第一个节点(文本节点),应该包含在元素()的
    innerHTML
    中。但是,当我用JSoup测试它时,它似乎可以删除空白。如果没有更多的研究,我不会相信它不在那里。我猜Jsoup通过DOM生成
    html()
    的输出,文本节点是使用创建的,这表明文本被修剪和规范化了。@luksch:No,我怀疑这是用来构建HTML字符串的。实际上,
    ol.notes
    是我在写问题时犯的一个错误。我确实使用了
    ol.annotations
    。我认为你的观点2。无效,因为html()是Jsoup的一个方法,不会返回原始html字符串,而是从解析的DOM生成的字符串。这意味着在第一个元素之前没有空格。@luksch:我必须测试它才能确定。看起来JSoup正在修剪字符串,但它可能不应该这样做。如果从HTML解析DOM,该HTML在
    ol
    的开始标记的
    之后和注释之前有空格,则该空格是
    ol
    中的第一个节点(文本节点),应该包含在元素()的
    innerHTML
    中。但是,当我用JSoup测试它时,它似乎可以删除空白。如果没有更多的研究,我不会相信它不在那里。我猜Jsoup通过DOM生成
    html()
    的输出,文本节点是使用创建的,这表明文本被修剪和规范化了。@luksch:No,我怀疑这是用来构建HTML字符串的。实际上,
    ol.notes
    是我在写问题时犯的一个错误。我确实使用了
    ol.annotations