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

时间:2013-10-13 20:19:35

标签: c# .net xpath .net-2.0 html-agility-pack

我试图获取一个元素的所有文本节点,包括它的子节点,但由于某种原因,它给了我整个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上找到的一个片段,但我不知道另一种做法,我一直都很疯狂。

1 个答案:

答案 0 :(得分:1)

您应该使用相对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规范中的Location PathsAbbreviated Syntax

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

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

  •