Seleccione HTML desde una posición específica usando Html Agility Pack

c# html html-agility-pack xpath

Pregunta

Necesito obtener nodos de texto html de, digamos, línea 64, posición de línea 45 a línea 183, posición de línea 22. Soy bastante nuevo en XPath y no estoy muy seguro de cuáles son mis opciones. ¿Cómo debo proceder? Tuve en mente algo como esto:

var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");

Respuesta aceptada

La clase HtmlNode tiene dos atributos importantes (para lo que necesita hacer):

  • Line (la línea donde comienza el nodo)
  • LinePosition (la línea donde termina el nodo)

Podrías hacer algo como:

var nodes = doc.DocumentNode.Descendants("#text").Where(
    x => (x.Line > 64 || (x.Line == 64 && x.LinePosition >= 45)) &&
         (x.Line < 183 || (x.Line == 183 && x.LinePosition <= 22))
);

por supuesto, también puede hacer doc.DocumentNode.SelectNodes("//text()").Where(...)

Un problema con el que tendrás que lidiar:

No le indica dónde finaliza el nodo, por lo que la solución anterior podría proporcionarle nodos que terminen en una línea de más de 183 , o en la línea 183 pero en una posición de más de 22 . Para eso, puede usar la propiedad OuterHtml del nodo y realizar algunas manipulaciones de cadenas (obtener la longitud para saber dónde termina, dividir por \n para saber cuántas líneas, etc.).


Respuesta popular

No puede hacer esto con XPath: no sabe nada sobre los números de línea y las posiciones de caracteres dentro del XML.

La función position() devuelve la posición relativa de un nodo en una lista de nodos, por ejemplo, devuelve 1 para el primer nodo de la lista, 2 para el segundo y así sucesivamente.

Para obtener información sobre la posición de la línea, puede analizar el XML utilizando XElement o XmlReader y luego usar la interfaz IXmlLineInfo .

Sin embargo, tenga en cuenta que el uso de posiciones de línea / carácter para identificar fragmentos de un archivo XML es problemático: los procesadores XML vuelven a formatear el XML de manera rutinaria, añadiendo / eliminando espacios y líneas finales, por lo que el mismo fragmento XML puede cambiar de posición.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow