Recupera tutti i nodi di testo dell'elemento inclusi i bambini utilizzando HtmlAgilityPack in C #

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

Domanda

Sto cercando di ottenere tutti i nodi di testo di un elemento compresi i suoi figli, ma per qualche motivo mi sta dando l'intero documento HTML.

Questo è quello che mi è venuto in mente:

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

Stampa text=line dell'intero documento. Sono sicuro che c'è qualcosa di sbagliato nel //text() , che è uno snippet che ho trovato qui in SO, ma non conosco un altro modo per farlo e ne sono impazzito.

Risposta accettata

Dovresti usare un'espressione XPath relativa, cioè relativa al tuo nodo di contesto 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()" seleziona tutti i nodi di testo discendenti del nodo radice del documento

Per i dettagli, vedere Percorsi posizione e Sintassi abbreviata dalle specifiche XPath.

  • //para seleziona tutti i para discendenti della radice del documento e quindi seleziona tutti gli elementi para nello stesso documento del nodo di contesto

  • .//para seleziona i discendenti dell'elemento para del nodo di contesto




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché