Jsdom: XPath-Abfragen des geparsten XML-Dokuments schlagen mit Großbuchstabenattributen fehl

Erstellt am 12. März 2019  ·  3Kommentare  ·  Quelle: jsdom/jsdom

Basisinformation:

  • Node.js-Version: 8.9.1
  • jsdom-Version: 14.0.0

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.

Minimaler Reproduktionsfall

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

Wie verhält sich ähnlicher Code in Browsern?

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.

x(ht)ml

Hilfreichster Kommentar

Alle 3 Kommentare

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?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Progyan1997 picture Progyan1997  ·  3Kommentare

drewish picture drewish  ·  4Kommentare

mitar picture mitar  ·  4Kommentare

camelaissani picture camelaissani  ·  4Kommentare

vsemozhetbyt picture vsemozhetbyt  ·  4Kommentare