C# Html敏捷xpath在以下情况下获取节点
我有一个结构如下的html文档: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
<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);
}