0

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

4

1 回答 1

2

您应该使用相对 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 元素后代

于 2013-10-13T21:59:44.017 回答