Wenn XPath zum Abfragen/Auswerten eines von JSDOMs DOMParser generierten XML-Dokuments verwendet wird, scheint der Attributteil der Abfrage auf Kleinbuchstaben gezwungen zu sein, wodurch es unmöglich wird, nach Attributen abzufragen, die Großbuchstaben enthalten.
Zum Beispiel das folgende Dokument gegeben:
<?xml version="1.0" encoding="utf-8"?><example Foo="bar"></example>
^-- capital F
Eine Abfrage für //*[@Foo="bar"]
(oder //*[@foo="bar"]
für diese Angelegenheit) gibt keine Übereinstimmungen zurück, jedoch wird dieses Dokument stattdessen mit Kleinbuchstabenattributen angegeben:
<?xml version="1.0" encoding="utf-8"?><example foo="bar"></example>
^-- lower case F
Mit diesem neuen Dokument finden //*[@foo="bar"]
( und das in Großbuchstaben geschriebene Äquivalent //*[@Foo="bar"]
) erfolgreich die Übereinstimmung.
Ich habe vor langer Zeit ein ähnliches Problem gefunden (https://github.com/jsdom/jsdom/issues/651), das durch die Einführung von Saxes behoben wurde, um XML-Dokumente getrennt von HTML-Dokumenten zu parsen, jedoch derzeit auf der Parsing-Ebene alles scheint richtig geparst zu werden (zB behalten die Attribute ihre Groß-/Kleinschreibung bei). Auf der XPath-Auswertungsebene scheint die Abfrage in Kleinbuchstaben geschrieben zu sein.
Ich habe versucht einzugrenzen, wo der Fehler auftreten könnte, und habe https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659 erreicht
Das Festlegen dieses shouldLowerCase
Werts auf false
behebt meinen Anwendungsfall, aber mir ist nicht bewusst, welche Auswirkungen dies auf den Rest der XPath-Implementierung hat.
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 ,Konsole
Bei der XPath-Abfrage wird die Groß-/Kleinschreibung beachtet und kann mit Knoten mit Attributen mit Großbuchstaben abgeglichen werden.
Wir hatten lange Zeit die Aufgabe, unsere alte handgerollte xpath-Implementierung durch eine gewartete Drittanbieter-Implementierung zu ersetzen. Dies ist wahrscheinlich der beste Weg, um dies zu beheben, obwohl eine Spot-Fix-PR mit einem Test auch akzeptabel wäre.
Hallo, irgendwelche Updates?
Hilfreichster Kommentar
https://mobile.twitter.com/slicknet/status/782274190451671040