Jsdom: As consultas XPath do documento XML analisado falham com atributos em maiúsculas

Criado em 12 mar. 2019  ·  3Comentários  ·  Fonte: jsdom/jsdom

Informação básica:

  • Versão Node.js: 8.9.1
  • versão jsdom

Ao usar XPath para consultar / avaliar um documento XML gerado pelo DOMParser do JSDOM, a parte do atributo da consulta parece ser forçada a minúsculas, tornando impossível consultar os atributos que contêm caracteres maiúsculos.

Por exemplo, dado o seguinte documento:

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

Uma consulta para //*[@Foo="bar"] (ou //*[@foo="bar"] para esse assunto) não retorna nenhuma correspondência, no entanto, dado este documento em vez de atributos em minúsculas:

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

Agora, com este novo documento, //*[@foo="bar"] ( e o equivalente em maiúsculas //*[@Foo="bar"] ) encontrou a correspondência com sucesso.

Eu encontrei um problema semelhante há muito tempo (https://github.com/jsdom/jsdom/issues/651) que foi corrigido pela introdução do Saxes para analisar documentos XML separadamente de documentos HTML, no entanto, atualmente no nível de análise de tudo parece ser analisado corretamente (por exemplo, os atributos mantêm suas maiúsculas e minúsculas). É no nível de avaliação XPath que a consulta parece estar em letras minúsculas.

Tentei restringir onde o erro pode estar ocorrendo e cheguei a https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659

Definir esse shouldLowerCase como false corrige meu caso de uso, mas não estou ciente das implicações que isso tem para o resto da implementação XPath.

Caso de reprodução 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

Como um código semelhante se comporta em navegadores?

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

A consulta XPath faz distinção entre maiúsculas e minúsculas e pode corresponder a nós com atributos com caracteres maiúsculos.

x(ht)ml

Comentários muito úteis

Todos 3 comentários

Há muito tempo que fazemos uma tarefa para substituir nossa antiga implementação xpath enrolada à mão por uma de terceiros mantida. Essa é provavelmente a melhor rota para consertar isso, embora um PR com um teste também seja aceitável.

Oi, alguma atualização?

Esta página foi útil?
0 / 5 - 0 avaliações