Ich versuche, alle Textknoten eines Elements einschließlich seiner Kinder zu bekommen, aber aus irgendeinem Grund gibt es mir den gesamten HTML-Dokumenten.
Das ist, was ich mir ausgedacht habe:
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(" ", " "));
}
}
Es wird text=line
des gesamten Dokuments gedruckt. Ich bin mir sicher, dass etwas mit dem //text()
stimmt, das ist ein Ausschnitt, den ich hier bei SO gefunden habe, aber ich kenne keine andere Art, es zu tun, und ich bin damit verrückt geworden.
Sie sollten einen relativen XPath-Ausdruck verwenden, dh relativ zu Ihrem el
Kontextknoten
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()"
wählt alle untergeordneten Textknoten des Dokumentstammknotens aus
Weitere Informationen finden Sie unter Standortpfade und Abgekürzte Syntax aus XPath-Spezifikationen.
//para
wählt alle para-Nachkommen des Dokumentenstamms aus und wählt somit alle para-Elemente im selben Dokument wie der Kontextknoten aus
.//para
wählt die Para-Element-Nachkommen des.//para
aus