xmldom ialah isian kuda javascript untuk menyediakan API berikut yang terdapat dalam penyemak imbas moden kepada masa jalan lain:
- tukar rentetan XML kepada pepohon DOM
new DOMParser().parseFromString(xml, mimeType) => DocumentSalin selepas log masuk
- buat, akses dan ubah suai pepohon DOM
new DOMImplementation().createDocument(...) => DocumentSalin selepas log masuk
- mensirikan pepohon DOM kembali menjadi rentetan XML
new XMLSerializer().serializeToString(node) => stringSalin selepas log masuk
Sumber: xmldom readme
Sejak saya mula menyumbang kepada perpustakaan xmldom bercabang pada Jun 2020, terdapat 40 keluaran.
Ia adalah projek yang sangat menarik dan mencabar dan berkemungkinan besar akan kekal begitu untuk beberapa lama.
Menurut GitHub, lebih 50 orang telah menyumbang kepadanya sejak ia dicabangkan.
Terima kasih sekali lagi kepada semua penyumbang.
Dan ini tidak mengira semua orang yang berjaya beralih daripada pakej xmldom asal yang tidak berskop, kepada pakej @xmldom/xmldom berskop versi 0.7.0 untuk mendapatkan semua pembetulan keselamatan.
Versi terbaharu dikeluarkan sebagai tag lts ialah 0.7.13.
Versi terakhir dengan perubahan pecah ialah 0.8.0 yang dikeluarkan pada 22 Dis 2021, hampir 3 tahun yang lalu.
Versi terbaharu dikeluarkan sebagai terkini ialah 0.8.10.
Tetapi apa yang saya ingin bincangkan hari ini ialah semua barangan yang telah dikeluarkan di bawah tag seterusnya sejak Oktober 2022.
Saya sangat teruja dengan perubahan tersebut kerana ia menyediakan asas yang jelas untuk perubahan yang berpotensi pada masa hadapan.
TLDR: Lebih penjajaran dengan spesifikasi dan perbezaan dibuat sejelas mungkin.
Satu aspek yang menjadikan pelaksanaan kompleks, ialah terdapat peraturan yang berbeza untuk menghuraikan XML lwn HTML.
xmldom (pada tahap tertentu) "menyokong" kedua-dua perisa dari awal. Malah tidak diperlukan untuk meluluskan mimeType sama sekali: Peraturan untuk digunakan telah diputuskan berdasarkan ruang nama lalai semasa rentetan/nod XML yang sedang dihuraikan.
Ini berakhir dengan 0.9.0: Mulai sekarang mimeType dalam DOMParser.parseFromString(xml, mimeType) adalah wajib dan merupakan satu-satunya perkara yang pernah disemak untuk memutuskan sama ada untuk menggunakan peraturan XML atau HTML. Basta.
Dan maklumat itu disimpan dalam Dokumen yang terhasil (sifat jenis baharu), jadi apabila mensirikannya, peraturan yang betul digunakan semula.
Ini adalah perubahan besar-besaran (dan berkemungkinan pecah), tetapi saya sangat teruja ia sudah sedia, kerana ia menjadikan banyak pembetulan pepijat yang berkaitan mungkin/cara lebih mudah untuk dilaksanakan dan juga mengurangkan kerumitan API dan pelaksanaan.
Selain itu, ia kini hanya menerima jenis mime yang ditentukan dan membuang TypeError dalam mana-mana kes lain.
Aspek yang secara peribadi mengelirukan saya tentang pengendalian ralat API penyemak imbas asli ialah ia sentiasa mengembalikan Dokumen dan jika berlaku kesilapan, nod parsererror akan menjadi anak pertama badan:
Memandangkan pengendalian ralat tidak pernah berfungsi dengan cara ini dalam xmldom tetapi pengendalian ralat sedia ada adalah sangat kompleks dan mengelirukan dan didokumentasikan dengan teruk, 0.9.0 memudahkannya dan kini mempunyai tingkah laku yang konsisten (jauh lebih) terhadap sebarang kemungkinan ralat yang berlaku semasa penghuraian:
Ia melemparkan ParseError ?, mis. dalam salah satu kes berikut:
Masih terdapat kes yang tinggal yang dilaporkan sebagai amaran (terutamanya semasa menghuraikan HTML) atau sebagai ralat yang tidak menghalang data daripada diproses, tetapi pengendalian ralat baharu menjadikannya sangat mudah untuk memutuskan betapa ketatnya kod itu. menggunakan xmldom perlu.
Pilihan (tidak mematuhi spesifikasi) yang boleh dihantar kepada pembina DOMParser dipanggil onError.
ia memerlukan fungsi dengan tandatangan berikut:
function onError(level:ErrorLevel, message:string, context: DOMHandler):void;
Adalah syor untuk menggunakan salah satu daripadanya untuk menghentikan pemprosesan XML pada isyarat pertama apa-apa yang tidak dijangka:
// prevent parsing of XML that has `error`s new DOMParser({onError: onErrorStopParsing}).parseFromString(...) // prevent parsing of XML that has `warning`s new DOMParser({onError: onWarningStopParsing}).parseFromString(...)
Another fork of the original xmldom repository made it's way back into our repo by extending the HTML entities to the complete set (also available in 0.8.x) and porting over the implementation of the compareDocumentPosition API. Thank you, and welcome @zorkow
Along the way several places where xmldom so far returned undefined instead of null, have been fixed to adhere to the spec.
And I discovered that the former author seems to have preferred iterating from the end of a list in so many places, that attributes were processed in the reverse order in multiple places, which is now fixed.
The implementation of the removeChild API changed quite a bit, to comply to the spec and throws a DOMException when it should.
And 3 related bugs were fixed in a way that clearly states what the future direction of xmldom is:
Support for lax HTML parsing rules will only be provided if proper strict XML parsing doesn't suffer from it.
The former (broken) "support" for automatic self closing tags in HTML is gone.
More recently @shunkica invested a huge amount of time end effort to fix tons of issues in the former handling of the internalSubset part of the !DOCTYPE.
It is now preserved as part of the internalSubset property of the doctype of a Document and many wrong doctype declarations are now correctly detected as such and reported as a fatalError.
Also thanks to @kboshold for the latest bug fix in this area.
Along the way we created a new module containing regular expressions for the relevant grammar, and correctness checks are based on those and they are properly covered by tests.
It is not the goal of xmldom to become a validating parser, but this a great step to support those documents that come with more complex DTDs.
Up to now development was done using Node v10, since this is also the lowest version xmldom currently supports. As part of the work on the upcoming version, I decided to switch to v18 for development, since more and more devDependencies also made this a minimum requirement. This will be the new minimum runtime version for the time being starting with this release.
I initiated a public poll / dicussion to ask people which version of Node or other runtimes they need support for.
The next breaking release will most likely drop support for some older Node versions, if there is no feedback indicating something different.
Along the way plenty of APIs have received jsdoc comments with proper types.
for taking the time to read through all of this.
Those are quite some changes, and I'm very excited to be able to ship those.
I hope you are as excited as I am :)
If you need more details you can go through the very detailed changelog, or head over to the repository and join or start a discussion or file an issue.
Atas ialah kandungan terperinci Keluarkan .f `@xmldom/xmldom`. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!