我试图获取一个元素的所有文本节点,包括它的子节点,但由于某种原因,它给了我整个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上找到的一个片段,但我不知道另一种做法,我一直都很疯狂。
答案 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 Paths和Abbreviated Syntax。
//para
选择文档根目录的所有para后代,从而选择与上下文节点相同的文档中的所有para元素
.//para
选择上下文节点的para元素后代