2011-05-20 15 views
5

Estoy usando HtmlAgilityPack.Búsqueda de XPath para todos los nodos de texto, no el texto interno de ningún otro nodo secundario

Yo cierro sobre el nodo primario y sus ChildNodes muestran varios nodos #text. El valor de XPath muestra /code[1]/#text[1]. Trato de usar //#text para obtener todos los nodos de texto, pero me sale ese error:

error: Expression must evaluate to a node-set.

He intentado //text y sale nada, pero ningún error.

+0

Lo que está mostrando '/ código [1]/# de texto [1]' como el XPath? Eso no es válido XPath. – LarsH

+0

@LarsH En los ChildNodes actuales HtmlNode (nombre = código), abriendo el primer nodo #text y desplácese hacia abajo a su XPath en el depurador VS 2008, muestra que XPath. –

+0

Bien, no estoy familiarizado con el depurador VS 2008, pero el "XPath" que te muestra no es realmente XPath. :-('#' no es parte de la sintaxis. – LarsH

Respuesta

5

Debe usar text() para obtener nodos de texto. Para obtener todos los nodos de texto en el documento, use //text().

Desde el specification:

text() matches any text node.

+0

Esto funciona más o menos. Tengo el nodo principal y hago parent.SelectNodes ("// text()") y obtengo todos los nodos de texto para el padre, sino también todos los otros nodos de texto debajo del padre en el documento - ¡extraño! Tenía que hacer parent.SelectNodes (parent.XPath + "// text()") para obtener todos los textos, pero ¿esto aún no daría el textos de niños como estilo, etc.? –

+0

Vaya con 'parent.SelectNodes (" text() ")'. No entiendo la última parte de su pregunta ... – lonesomeday

+4

@Chuck, el hecho de que está recibiendo todos los nodos de texto que son descendientes del padre son exactamente para lo que '//' es. '//' es la abreviatura de 'descendiente ::'. Si solo quieres nodos de texto que son hijos directos de 'padre', usa ' child :: text() '. La abreviatura para eso es simplemente' text() ', como se sugirió @lonesome. – LarsH

Cuestiones relacionadas