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>
节点。
它可以工作,但需要很长时间,我想是因为对于每个节点,它测试所有其他节点的值。
如何提高查询性能
您可以这样做:
- 查找所有的section定义并将它们存储在一个列表中
- 循环遍历节定义
- ,并通过在查询 中指定下一个节的确切名称来获取该节和下一个节之间的所有节点(如果没有更多的节定义,则在文档的末尾)。
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::
)