Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Html敏捷xpath在以下情况下获取节点_C#_Xpath_Html Agility Pack - Fatal编程技术网

C# Html敏捷xpath在以下情况下获取节点

C# Html敏捷xpath在以下情况下获取节点,c#,xpath,html-agility-pack,C#,Xpath,Html Agility Pack,我有一个结构如下的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 clas

我有一个结构如下的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>

我想在一个单独的列表中检索所有节点,直到下一节,所以直到下一节

目前我正在使用:

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
}

对于(int段落=xx;段落您可以执行以下操作:

  • 查找所有节定义并将其存储在列表中
  • 循环浏览节定义
    • 并通过在查询中指定下一节的确切名称来获取此节和下一节(如果没有更多节定义,则获取文档末尾)之间的所有节点
  • var doc=new HtmlDocument();
    doc.Load(@“path\to\file.html”);
    var sects=doc.DocumentNode.SelectNodes(//h3[a[以(@name,'sect')]开头]);
    对于(var索引=0;索引
    这将具有以下优点:

    • 不尝试查找不存在的节号
    • 使用上下文节点(以
      /
      开始查询),以便不会搜索文档中不必要的部分
    • 在下一个
      h3
      h3[1]
      )处停止,以便不搜索文档中不必要的部分
    • 只搜索同级而不搜索子级(
      以下同级::
      而不是
      以下::

    它工作得很好,从几分钟到几秒钟!你能解释一下你是如何“停在下一个h3”的吗?它是xpath中的h3[1]部分吗?@Belterius很高兴听到它,感谢你的反馈:)是的,它是
    h3[1]
    xpath中的一部分-xpath处理器引擎应该知道,一旦找到
    h3
    :),就不必再检查其他节点了
    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);
    
    }