Recupere todos los nodos de texto del elemento, incluidos los hijos, utilizando HtmlAgilityPack en C #

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

Pregunta

Estoy tratando de obtener todos los nodos de texto de un elemento, incluidos sus hijos, pero por alguna razón me está dando todos los documentos HTML.

Esto es lo que se me ocurrió:

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

Se imprimirá text=line de todo el documento. Estoy seguro de que hay algo mal con el //text() , que es un fragmento que encontré aquí en SO, pero no conozco otra forma de hacerlo y me estoy volviendo loco con eso.

Respuesta aceptada

Se debe utilizar una expresión XPath relativa, es decir, en relación con su el nodo de contexto

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()" seleccionará todos los nodos de texto descendente del nodo raíz del documento

Consulte Rutas de ubicación y Sintaxis abreviada de las especificaciones de XPath para obtener más información.

  • //para selecciona todos los descendientes para de la raíz del documento y, por lo tanto, selecciona todos los elementos para en el mismo documento que el nodo contextual

  • .//para selecciona los elementos para descendientes del nodo de contexto



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué