Alat pembangun · Penukar sintaks
XML hingga JSON pemetaan: atribut, nod teks dan masalah satu lawan banyak
· Bagaimana ia berfungsi
xml json format data
Tiada satu cara yang betul untuk menukar XML kepada JSON, kerana XML mempunyai atribut, kandungan bercampur dan tertib kanak-kanak yang JSON tidak mempunyai. Catatan ini menerangkan konvensyen pemetaan biasa dan perangkap dalam setiap konvensyen.
Mengapa satu <item> menjadi objek dan dua menjadi tatasusunan — suapan XML yang JSON bentuknya berubah bergantung pada bilangan entri yang ada
Suapan dengan `<item>one</item>` menghasilkan `"item": "one"`; menambahkan adik beradik kedua menukar harta itu kepada `"item": ["one", "two"]`. Penghurai tidak boleh membuat kesimpulan bahawa satu item secara konsep adalah senarai satu kerana kedua-dua makna mempunyai sintaks XML yang sama. Oleh itu, kod yang dibina berdasarkan sampel pertama sahaja boleh gagal apabila pengeluaran menghantar yang kedua.
ToolAcre tidak menyembunyikan ketidakstabilan ini di sebalik pilihan sentiasa tatasusunan. Ia merekodkan nama sekali sebagai satu nilai dan adik beradik berulang sebagai tatasusunan. Pemetaan langsung itu mudah untuk diperiksa, tetapi pengguna yang memerlukan bentuk koleksi yang stabil mesti menggunakan pengetahuan skema atau menormalkan hasil sendiri selepas penukaran.
Perkara XML yang JSON tidak ada — atribut, teks bercampur unsur, adik beradik tertib, ruang nama, ulasan dan arahan pemprosesan
XML memisahkan atribut daripada elemen anak, mengekalkan susunan adik-beradik, membenarkan teks antara elemen, membawa awalan ruang nama dan boleh mengandungi ulasan dan arahan pemprosesan. JSON menawarkan objek dan tatasusunan tetapi tidak mempunyai persamaan terbina dalam untuk kategori nod tersebut. Sebarang hasil XML-to-JSON akibatnya adalah unjuran yang dipilih, bukan terjemahan universal.
Pembaca ini menggugurkan pengisytiharan, ulasan dan arahan pemprosesan. Awalan ruang nama kekal verbatim dan bukannya diselesaikan: `<ns:item>` menjadi kunci `ns:item`, manakala `xmlns:ns` menjadi `@xmlns:ns`. Teks bercampur dicantumkan di bawah satu kekunci, jadi kedudukan asalnya di sekeliling elemen kanak-kanak hilang dan amaran mengatakan penukaran tidak boleh pergi balik.
Konvensyen atribut — awalan seperti @ atau $, sebab ia wujud dan cara atribut dan elemen anak dengan nama yang sama bertembung
Atribut menggunakan awalan `@`. `<user id="7"><id>other</id></user>` menjadi objek dengan `@id` sama dengan `"7"` dan anak `id` sama dengan `"other"`. Awalan menghalang dua binaan XML berbeza daripada bertembung dalam satu sifat objek. Ia juga menjadi sebahagian daripada kontrak penukar apabila JSON ditulis semula kepada XML.
Perpustakaan lain boleh menggunakan `$`, objek atribut atau konvensyen lain. ToolAcre sahaja menyokong pemetaan `@` yang kelihatan. Menukar awalan itu dalam kod aplikasi tanpa menukar penulis akan menukar atribut kepada elemen, jadi simpannya apabila menggunakan nilai yang ditukar sebagai borang pemeriksaan perantaraan.
Konvensyen nod teks — #teks atau _ untuk kandungan elemen, dan perkara yang berlaku apabila elemen mempunyai teks dan kanak-kanak
Unsur yang mengandungi sahaja teks runtuh ke rentetan itu. Apabila atribut atau kanak-kanak turut hadir, teks kekal di bawah `#text`; CDATA disimpan secara berasingan di bawah `#cdata`. Teg penutup sendiri menjadi rentetan kosong. Kekunci yang dikhaskan ini membolehkan penulis membezakan nama anak biasa daripada kategori kandungan yang JSON sendiri tidak tentukan.
Kandungan campuran kekal lossy. Dalam `<p>before<b>bold</b>after</p>`, kedudukan "sebelum" dan "selepas" relatif kepada kanak-kanak tidak boleh dibina semula daripada harta `#text` yang bercantum. Alat ini mengesan corak struktur itu dan memberi amaran. Gunakan XML API yang memelihara nod apabila pesanan dokumen adalah sebahagian daripada makna.
Masalah satu lawan banyak — elemen berulang menjadi tatasusunan sahaja apabila diulang dan mengapa pengguna mesti mengekod secara defensif
Adik beradik yang berulang bertukar menjadi tatasusunan sahaja selepas pengulangan diperhatikan. Satu `<book>` ialah satu objek; dua buku adalah susunan objek. Ini kadangkala dipanggil masalah satu lawan banyak, tetapi ia bukan kecacatan penghurai. Dokumen sumber sahaja tidak mengandungi perisytiharan senarai bebas daripada kejadiannya.
Pengguna defensif boleh menormalkan laluan yang diketahui dengan pengetahuan skema: bungkus `catalogue.book` apabila ia belum menjadi tatasusunan. Jangan gunakan peraturan itu untuk setiap sifat, kerana skalar biasa tidak boleh menjadi senarai semata-mata untuk simetri. Penukar sengaja mengelak daripada mencipta maklumat domain tersebut.
Contoh yang berfungsi: menukar dokumen kecil gaya RSS — atribut, elemen berulang dan ruang nama, dengan JSON yang dihasilkan beranotasi
Tukar `<feed xmlns:m="https://example.invalid/meta"><item id="1"><m:title>One</m:title></item><item id="2"><m:title><![CDATA[Two & More]]></m:title></item></feed>`. Akarnya ialah `feed`; `@xmlns:m` mengekalkan perisytiharan ruang nama; `item` ialah tatasusunan; setiap `@id` ialah teks; dan tajuk kedua mengandungi `#cdata`.
Jenis inferens dimatikan secara lalai, jadi walaupun `id="2"` kekal rentetan `"2"`. Mendayakan inferens membolehkan penghurai membaca teks angka dan Boolean sebagai jenis JavaScript, tetapi XML tidak mengisytiharkan niat itu. Pilihannya ialah tekaan yang dikawal oleh pengguna, bukan bukti yang dibekalkan oleh dokumen.
Perkara ini tidak meliputi — penukaran terdorong skema yang mengetahui elemen sentiasa senarai, yang memerlukan XSD atau pemetaan manual
Tiada XSD dimuatkan dan tiada maklumat senarai dipacu skema tersedia. Penukar tidak dapat mengetahui bahawa elemen boleh diulang apabila sahaja satu muncul, mengesahkan kanak-kanak yang diperlukan, menyelesaikan URI ruang nama ke dalam jenis aplikasi atau menjana klien yang ditaip. Penghuraian yang berjaya sahaja menetapkan XML yang terbentuk dengan baik yang diterima oleh pembaca yang dikonfigurasikan.
DOCTYPE perisytiharan ditolak sebelum menghuraikan, termasuk yang tidak berbahaya. Sempadan itu menghalang permintaan entiti luaran, pembacaan fail setempat dan pengembangan entiti. Mengalih keluar DOCTYPE juga boleh mengalih keluar pengisytiharan yang bergantung kepada dokumen, jadi lakukan itu sahaja apabila anda memiliki data dan memahami akibatnya.
Bawa pulang: XML hingga JSON ialah pemetaan, bukan terjemahan — dan cara panel penukar Sintaks membolehkan anda memeriksa pemetaan itu dalam pelayar anda
Anggap hasilnya sebagai pemetaan terdokumentasi ToolAcre: `@` untuk atribut, `#text` untuk teks unsur campuran, `#cdata` untuk CDATA, tatasusunan selepas adik beradik berulang dan awalan ruang nama literal. Peraturan tersebut menjadikan output boleh diramal tanpa berpura-pura XML dan JSON berkongsi satu model data.
Untuk pemeriksaan, unjuran ini pantas dan boleh dibaca. Untuk penyepaduan tahan lama, uji satu dan banyak kejadian, atribut berkongsi nama dengan kanak-kanak, elemen kosong, kandungan bercampur dan ruang nama. Jika susunan elemen atau kekangan skema adalah penting, huraikan XML terhadap kontrak tersebut dan bukannya bergantung pada bentuk ditukar generik.
Simpan lekapan XML mentah di sebelah jangkaan biasa. Gandingan itu mengekalkan bukti jika peningkatan kebergantungan mengubah pengendalian tatasusunan, pemangkasan ruang kosong atau penyahkodan entiti. Ia juga memberi pengulas tempat untuk melihat perbezaan yang tidak dapat dibawa oleh paparan JSON. Objek yang ditukar sahaja tidak dapat membuktikan sama ada rentetan kosong datang daripada elemen penutup sendiri, tag berpasangan atau konvensyen lain dalam sumber.