При использовании 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 чувствителен к регистру и может соответствовать узлам с атрибутами с символами верхнего регистра.
У нас в течение долгого времени была задача заменить нашу древнюю ручную реализацию xpath на поддерживаемую стороннюю. Это, вероятно, лучший способ исправить это, хотя частичное исправление ошибок с тестом также будет приемлемым.
Привет, есть обновления?
Самый полезный комментарий
https://mobile.twitter.com/slicknet/status/782274190451671040