re: test () XPath a HtmlAgilityPack (obtener todas las etiquetas p con expresiones regulares emparejadas internas)

c# html html-agility-pack xpath

Pregunta

Quiero todas las etiquetas <p>=.+=</p> . El Regex funciona por sí solo, sin las etiquetas <p> .

Aquí está mi XPath: "//p[re:test(.,'^=.+=$', 'i')]"

Pero estoy recibiendo una excepción cuando lo conecto,

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

La excepción es:

Namespace Manager o XsltContext es necesario. Esta consulta tiene un prefijo, una variable o una función definida por el usuario.

Edición: El HTML es generado por FCKEditor y no tiene un espacio de nombres definido. ¿Necesito configurar algo para que esto funcione?

El HTML:

<p><style type="text/css">
h2 a { color: black; }</style></p>
<p>----</p>
<h2>test <a href="http://searisen.com">link</a></h2>
<p>== Heading 2 ==</p>
<p>----</p>
<p>=== Heading [http://searisen.com SeaRisen.com] ===</p>

Respuesta aceptada

El error que tienes se debe al hecho de que la expresión re:test usa una función XPATH llamada test (declarada en un espacio de nombres cuyo prefijo es re ), que es desconocida para el contexto XSLT.

No sé de dónde sacaste esa expresión, pero no es estándar, por lo que no significa nada en el contexto del Paquete de Agilidad Html :-)

Para una explicación detallada, vea este artículo interesante aquí: Agregar funciones personalizadas a XPath . Tenga en cuenta que podría hacer que funcione con estas técnicas.

Dicho esto, aquí hay una implementación "pura" de Html Agility Pack / XPATH:

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p[text()='=.+=']");

Utiliza un filtro (entre [y]) y el texto de la función XPATH estándar () que significa "texto interno".


Respuesta popular

Al parecer, HtmlAgilityPack no maneja espacios de nombres (no es que tuviera uno). Así que he venido con este truco,

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p")
    .Where(node => Regex.Match(node.InnerText, "^=.+=$").Success);

¡Si hay una solución HtmlAgilityPack me encantaría escucharla!



Related

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é