使用C#中的HtmlAgilityPack检索包含子元素的元素的所有文本节点

.net .net-2.0 c# html-agility-pack xpath

我试图获取一个元素的所有文本节点,包括它的子节点,但由于某种原因,它给了我整个文档HTML。

这就是我想出的:

HtmlAgilityPack.HtmlNode el = htmlDoc.DocumentNode.SelectSingleNode("(//div[@class='TableContainer'])[" + index + "]");
if (el != null)
{
    foreach (HtmlNode node in el.SelectNodes("//text()"))
    {
        Debug.WriteLine("text=" + node.InnerText.Replace(" ", " "));
    }
}

它将打印整个文档的text=line 。我确定//text()有一些问题,这是我在SO上找到的一个片段,但我不知道另一种方法,我已经疯了。

一般承认的答案

您应该使用相对XPath表达式,即相对于el上下文节点

HtmlAgilityPack.HtmlNode el = htmlDoc.DocumentNode.SelectSingleNode("(//div[@class='TableContainer'])[" + index + "]");
if (el != null)
{
    foreach (HtmlNode node in el.SelectNodes(".//text()"))
    {
        Debug.WriteLine("text=" + node.InnerText.Replace(" ", " "));
    }
}

"//text()"将选择文档根节点的所有后代文本节点

有关详细信息,请参阅XPath规范中的位置路径缩写语法

  • //para选择文档根的所有para后代,从而选择与上下文节点相同的文档中的所有para元素

  • .//para选择上下文节点的para元素后代



Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因