Jsdom: Запросы XPath проанализированного XML-документа завершаются ошибкой с атрибутами верхнего регистра

Созданный на 12 мар. 2019  ·  3Комментарии  ·  Источник: jsdom/jsdom

Основная информация:

  • Версия Node.js: 8.9.1
  • версия jsdom

При использовании XPath для запроса / оценки XML-документа, сгенерированного DOMParser JSDOM, атрибутная часть запроса, по-видимому, переводится в нижний регистр, что делает невозможным запрос атрибутов, содержащих символы в верхнем регистре.

Например, учитывая следующий документ:

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

Запрос для //*[@Foo="bar"] (или //*[@foo="bar"] на то пошло) не возвращает совпадений, однако с учетом этого документа вместо этого с атрибутами нижнего регистра:

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

Теперь с этим новым документом //*[@foo="bar"] ( и эквивалент //*[@Foo="bar"] в верхнем регистре) успешно находит совпадение.

Я обнаружил похожую проблему давным-давно (https://github.com/jsdom/jsdom/issues/651), которая была исправлена ​​введением Saxes для синтаксического анализа XML-документов отдельно от HTML-документов, однако в настоящее время на уровне синтаксического анализа все кажется, анализируется правильно (например, атрибуты сохраняют свой регистр). На уровне оценки XPath запрос выглядит более низким.

Я попытался сузить область, где могла возникнуть ошибка, и достиг https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659

Установка этого значения shouldLowerCase на false исправляет мой вариант использования, но я не знаю, какие последствия это имеет для остальной части реализации XPath.

Минимальный размер репродукции

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

Как похожий код ведет себя в браузерах?

https://jsbin.com/qegifaqumi/2/edit?js , консоль

Запрос XPath чувствителен к регистру и может соответствовать узлам с атрибутами с символами верхнего регистра.

Самый полезный комментарий

Все 3 Комментарий

У нас в течение долгого времени была задача заменить нашу древнюю ручную реализацию xpath на поддерживаемую стороннюю. Это, вероятно, лучший способ исправить это, хотя частичное исправление ошибок с тестом также будет приемлемым.

Привет, есть обновления?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги