Jsdom: Kueri XPath dokumen XML yang diurai gagal dengan atribut huruf besar

Dibuat pada 12 Mar 2019  ·  3Komentar  ·  Sumber: jsdom/jsdom

Info dasar:

  • Versi Node.js: 8.9.1
  • versi jsdom: 14.0.0

Saat menggunakan XPath untuk membuat kueri/mengevaluasi dokumen XML yang dihasilkan oleh DOMParser JSDOM, bagian atribut kueri tampaknya dipaksa menjadi huruf kecil, sehingga mustahil untuk meminta atribut yang berisi karakter huruf besar.

Misalnya, diberikan dokumen berikut:

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

Kueri untuk //*[@Foo="bar"] (atau //*[@foo="bar"] dalam hal ini) tidak menghasilkan kecocokan, namun mengingat dokumen ini sebagai gantinya dengan atribut huruf kecil:

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

Sekarang dengan dokumen baru ini, //*[@foo="bar"] ( dan setara dengan huruf besar //*[@Foo="bar"] ) berhasil menemukan kecocokan.

Saya telah menemukan masalah serupa sejak lama (https://github.com/jsdom/jsdom/issues/651) yang diperbaiki dengan memperkenalkan Saxes untuk mengurai dokumen XML secara terpisah dari dokumen HTML, namun saat ini di tingkat penguraian semuanya tampaknya diurai dengan benar (misalnya atribut mempertahankan kasusnya). Pada tingkat evaluasi XPath itulah kueri tampaknya menggunakan huruf kecil.

Saya telah mencoba mempersempit di mana kesalahan mungkin terjadi, dan telah mencapai https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659

Menyetel nilai shouldLowerCase ke false memperbaiki kasus penggunaan saya, tetapi saya tidak mengetahui implikasi apa yang ada pada implementasi XPath lainnya.

Kasus reproduksi minimal

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

Bagaimana kode serupa berperilaku di browser?

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

Kueri XPath peka huruf besar-kecil dan dapat dicocokkan dengan node dengan atribut dengan karakter huruf besar.

x(ht)ml

Komentar yang paling membantu

Semua 3 komentar

Kami sudah lama memiliki tugas untuk mengganti implementasi xpath gulung tangan kuno kami dengan yang dikelola pihak ketiga. Itu mungkin rute terbaik untuk memperbaikinya, meskipun PR perbaikan-spot dengan tes juga dapat diterima.

Hai, ada pembaruan?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat