使用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合法嗎? 是的,了解原因