Jsdom: Las consultas XPath de documentos XML analizados fallan con atributos en mayúsculas

Creado en 12 mar. 2019  ·  3Comentarios  ·  Fuente: jsdom/jsdom

Información básica:

  • Versión de Node.js: 8.9.1
  • versión de jsdom: 14.0.0

Cuando se usa XPath para consultar / evaluar un documento XML generado por DOMParser de JSDOM, la parte de atributo de la consulta parece estar forzada a minúsculas, lo que hace imposible la consulta de atributos que contienen caracteres en mayúsculas.

Por ejemplo, dado el siguiente documento:

<?xml version="1.0" encoding="utf-8"?><example Foo="bar"></example>
                                               ^-- capital F

Una consulta para //*[@Foo="bar"] (o //*[@foo="bar"] para el caso) no devuelve coincidencias, sin embargo, dado este documento con atributos en minúsculas:

<?xml version="1.0" encoding="utf-8"?><example foo="bar"></example>
                                               ^-- lower case F

Ahora, con este nuevo documento, //*[@foo="bar"] ( y el equivalente en mayúsculas //*[@Foo="bar"] ) encuentran con éxito la coincidencia.

Encontré un problema similar desde hace mucho tiempo (https://github.com/jsdom/jsdom/issues/651) que se solucionó al introducir a Saxes para analizar documentos XML por separado de los documentos HTML, sin embargo, actualmente en el nivel de análisis todo parece haber sido analizado correctamente (por ejemplo, los atributos conservan su caso). Es en el nivel de evaluación de XPath donde la consulta parece estar en minúsculas.

He intentado reducir dónde podría estar ocurriendo el error y he llegado a https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659

Establecer ese shouldLowerCase en false arreglos para mi caso de uso, pero no estoy al tanto de las implicaciones que tiene para el resto de la implementación de XPath.

Estuche de reproducción mínima

const { JSDOM } = require("jsdom");

const dom = new JSDOM();

const domParser = new dom.window.DOMParser();
const doc = domParser.parseFromString('<?xml version="1.0" encoding="utf-8"?><example Foo="bar"></example>', 'text/xml');
const result = doc.evaluate('//*[@Foo="bar"]', doc, null, XPathResult.ANY_TYPE, null);
const exampleNode = result.iterateNext();
console.log('Result:', exampleNode); // exampleNode is null

¿Cómo se comporta un código similar en los navegadores?

https://jsbin.com/qegifaqumi/2/edit?js , consola

La consulta XPath distingue entre mayúsculas y minúsculas y puede coincidir con nodos con atributos con caracteres en mayúscula.

x(ht)ml

Comentario más útil

Todos 3 comentarios

Hemos tenido una tarea durante mucho tiempo para reemplazar nuestra antigua implementación de xpath hecha a mano por una de terceros mantenida. Esa es probablemente la mejor ruta para solucionar este problema, aunque también sería aceptable un PR de corrección puntual con una prueba.

Hola, ¿alguna actualización?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

khalyomede picture khalyomede  ·  3Comentarios

lehni picture lehni  ·  4Comentarios

vsemozhetbyt picture vsemozhetbyt  ·  4Comentarios

kentmw picture kentmw  ·  3Comentarios

jhegedus42 picture jhegedus42  ·  4Comentarios