Html敏捷xpath获取下面的节点

本文关键字:节点 获取 敏捷 xpath Html | 更新日期: 2023-09-27 18:01:36

我有一个html文档,结构为:

<h3><a name="sect55">55</a></h3>
<p></p>
<p class="choice"><a href="#sect325"></a></p>
<h3><a name="sect56"></a></h3>
<p></p>
<p class="choice"><a href="#sect222"></a></p>
<h3><a name="sect57"></a></h3>
<p></p>
<p class="choice"><a href="#sect164"></a></p>
<p class="choice"><a href="#sect109"></a></p>
<p class="choice"><a href="#sect308"></a></p>

我想在一个单独的List中检索到下一节之前的所有节点,所以直到下一个<h3>

现在我使用:

for (int paragraph = xx; paragraph <= yy; paragraph++)
{
       nameActual = "sect" + paragraph;
       nameNext = "sect" + (paragraph + 1);
       HtmlNodeCollection NodeOfParagraph = doc.DocumentNode.SelectNodes(String.Format("//h3[a[@name='{0}']]/following-sibling::p[following::h3/a[@name='{1}']]", nameActual, nameNext));
      //Multiples actions on my NodeOfParagraph
}

因此,我选择具有我正在寻找的值的<a>的第一个<h3>,然后我选择具有具有下一个值的<a>的后续节点的所有<p>节点。

它可以工作,但需要很长时间,我想是因为对于每个节点,它测试所有其他节点的值。

如何提高查询性能

Html敏捷xpath获取下面的节点

您可以这样做:

  1. 查找所有的section定义并将它们存储在一个列表中
  2. 循环遍历节定义
    • ,并通过在查询
    • 中指定下一个节的确切名称来获取该节和下一个节之间的所有节点(如果没有更多的节定义,则在文档的末尾)。
var doc = new HtmlDocument();
doc.Load(@"path'to'file.html");
var sects = doc.DocumentNode.SelectNodes("//h3[a[starts-with(@name, 'sect')]]");
for (var index = 0; index < sects.Count; index ++)
{
    var isLast = (index == sects.Count - 1);
    var xpath = ".//following-sibling::p";
    if (!isLast)
        xpath += string.Format("[following-sibling::h3[1][a/@name = '{0}']]", sects[index + 1].SelectSingleNode("./a").Attributes["name"].Value);
    var collection = sects[index].SelectNodes(xpath);
}

这样做的好处是:

  • 不查找不存在的分段号
  • 使用上下文节点(以./开始查询),以便不搜索文档的不必要部分
  • 在下一个h3 (h3[1])处停止,这样文档中不需要的部分就不会被搜索
  • 只搜索兄弟而不搜索后代(following-sibling::代替following::)