Jsdom: Les requêtes XPath du document XML analysé échouent avec des attributs en majuscule

Créé le 12 mars 2019  ·  3Commentaires  ·  Source: jsdom/jsdom

Informations de base:

  • Version de Node.js : 8.9.1
  • version jsdom

Lors de l'utilisation de XPath pour interroger/évaluer un document XML généré par DOMParser de JSDOM, la partie attribut de la requête semble être forcée en minuscules, ce qui rend impossible la recherche d'attributs contenant des caractères majuscules.

Par exemple, étant donné le document suivant :

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

Une requête pour //*[@Foo="bar"] (ou //*[@foo="bar"] d'ailleurs) ne renvoie aucune correspondance, mais étant donné ce document à la place avec des attributs en minuscule :

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

Maintenant, avec ce nouveau document, //*[@foo="bar"] ( et l'équivalent en majuscule //*[@Foo="bar"] ) réussissent à trouver la correspondance.

J'ai trouvé un problème similaire il y a longtemps (https://github.com/jsdom/jsdom/issues/651) qui a été résolu en introduisant Saxes pour analyser les documents XML séparément des documents HTML, mais actuellement au niveau de l'analyse tout semble être correctement analysé (par exemple, les attributs conservent leur casse). C'est au niveau de l'évaluation XPath que la requête semble être en minuscule.

J'ai essayé de réduire l'endroit où l'erreur pourrait se produire et j'ai atteint https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659

La définition de cette shouldLowerCase sur false corrige mon cas d'utilisation, mais je ne suis pas au courant des implications que cela a pour le reste de l'implémentation XPath.

Cas de reproduction minimale

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

Comment se comporte un code similaire dans les navigateurs ?

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

La requête XPath est sensible à la casse et peut correspondre à des nœuds avec des attributs avec des caractères majuscules.

x(ht)ml

Commentaire le plus utile

Tous les 3 commentaires

Nous avons eu du mal à remplacer notre ancienne implémentation xpath à la main par une implémentation tierce maintenue. C'est probablement le meilleur moyen de résoudre ce problème, bien qu'un PR de correction ponctuelle avec un test soit également acceptable.

Salut, des mises à jour ?

Cette page vous a été utile?
0 / 5 - 0 notes