Abrufen aller Textknoten des Elements, einschließlich unter Verwendung von HtmlAgilityPack in C #

.net .net-2.0 c# html-agility-pack xpath

Frage

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.

Akzeptierte Antwort

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



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum