Keluarkan .f `@xmldom/xmldom`

WBOY
Lepaskan: 2024-08-30 18:39:35
asal
469 orang telah melayarinya

Konteks

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) => Document
Salin selepas log masuk
  • buat, akses dan ubah suai pepohon DOM
new DOMImplementation().createDocument(...) => Document
Salin selepas log masuk
  • mensirikan pepohon DOM kembali menjadi rentetan XML
new XMLSerializer().serializeToString(node) => string
Salin selepas log masuk

Sumber: xmldom readme

Sejarah

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.

0.9.0 (2024-08-29)

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.

1. Menguatkuasakan mimeType untuk memberikan kembali kawalan

Satu aspek yang menjadikan pelaksanaan rumit, 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.

Ketegasan dan pengendalian Ralat

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:

Release .f `@xmldom/xmldom`

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:

  • Dalam versi sebelumnya adalah mungkin untuk beberapa rentetan XML yang tidak terbentuk dengan baik, Dokumen yang dikembalikan tidak akan mempunyai documentElement, yang kemungkinan besar akan membawa kepada TypeErrors kemudian dalam kod.
  • beberapa rentetan XML yang tidak terbentuk dengan baik kini akan dilaporkan dengan betul sebagai fatalError yang kini sentiasa menghalang sebarang pemprosesan selanjutnya.
  • beberapa perkara yang sebelum ini tidak dilaporkan sebagai ralat atau hanya dilaporkan sebagai amaran kini juga dilaporkan sebagai FatalError

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;
Salin selepas log masuk
  • ErrorLevel ialah sama ada amaran, ralat atau fatalError
  • xmldom sudah menyediakan pelaksana untuk dua kes penggunaan yang paling biasa:
    • onErrorStopParsing untuk membuang ParseError juga untuk semua isu tahap ralat
    • onWarningStopParsing untuk membuang ParseError juga untuk semua isu tahap ralat

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(...)
Salin selepas log masuk

compareDocumentPosition, extended HTML entities , null instead of undefined, ...

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.

coctype internalSubset

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.

And there is even more

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.

Thank you

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!