Récupérer tous les nœuds de texte d'élément, y compris les enfants, à l'aide de HtmlAgilityPack en C #

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

Question

J'essaie d'obtenir tous les nœuds de texte d'un élément, y compris ses enfants, mais pour une raison quelconque, il me fournit tous les documents HTML.

Voici ce que je suis venu avec:

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(" ", " "));
    }
}

Cela imprimera text=line du document entier. Je suis sûr qu'il y a quelque chose qui ne va pas dans //text() , qui est un extrait que j'ai trouvé ici à SO, mais je ne connais pas une autre façon de le faire et j'en suis devenu fou.

Réponse acceptée

Vous devez utiliser une expression XPath relative, c'est-à-dire relative à votre noeud de contexte 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()" sélectionnera tous les nœuds de texte descendants du nœud racine du document

Pour plus de détails, voir les chemins d’emplacement et la syntaxe abrégée à partir des spécifications XPath.

  • //para sélectionne tous les descendants de la racine du document et sélectionne ainsi tous les éléments para du même document que le nœud de contexte

  • .//para sélectionne les descendants d'élément para du noeud contextuel




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi