Format XML

Dirapikan di peramban Anda dan tidak pernah dikirim. Konten campuran dibiarkan dalam satu baris alih-alih diindentasi ulang, sebab menambahkan pergantian baris di sekitar teks mengubah makna dokumennya. Urutan dan tanda kutip atribut dipertahankan, dan deklarasi XML tidak pernah ditambahkan sendiri.

Apa pun yang Anda masukkan di sini tidak disimpan, dicatat, atau dibagikan.

Tempel XML untuk memberinya indentasi yang mudah dibaca atau memadatkannya jadi satu baris, sekaligus memeriksa apakah bentuknya benar. Kesalahan menunjuk baris dan kolom yang tepat. Semuanya berjalan di peramban Anda, jadi tidak ada yang diunggah.

Cara memakai

  1. Tempel XML Anda ke kolom masukan.
  2. Pilih Rapikan atau Perkecil, dan atur lebar indentasi bila perlu.
  3. Salin hasilnya, atau baca kesalahannya beserta baris dan kolom.

Well-formed tidak sama dengan valid

XML punya dua pengertian benar yang berbeda, dan keduanya sering tertukar. Well-formed berarti dokumen mematuhi sintaks: hanya ada satu elemen root, setiap tag ditutup oleh tag pasangannya, nilai atribut memakai tanda kutip, komentar dan CDATA ditutup, dan tidak ada teks liar di luar root. Ini bisa diperiksa hanya dari dokumennya, dan inilah yang dilaporkan alat ini.

Valid berarti dokumen juga sesuai dengan sebuah skema - DTD, XSD, atau tata bahasa RelaxNG - yang menentukan elemen apa saja yang boleh muncul, dalam urutan apa, berapa kali, dan seperti apa bentuk nilai atributnya. Pemeriksaan ini mustahil dilakukan tanpa skemanya, dan sebuah dokumen bisa saja well-formed sempurna tetapi sama sekali tidak masuk akal menurut tata bahasa yang katanya diikuti.

Namespace berada sedikit di luar keduanya. Prefiks yang dipakai tanpa deklarasi xmlns yang sesuai adalah kesalahan namespace, bukan kesalahan well-formed, sehingga dokumen bisa lolos pemeriksaan sintaks tetapi tetap ditolak parser yang mengenali namespace. Jika dokumen SOAP atau Office ditolak padahal bisa diformat dengan rapi, periksa dulu apakah ada prefiks yang belum dideklarasikan.

Spasi kadang adalah data

Inilah aturan yang mengatur semua yang dilakukan formatter. Spasi di antara elemen hampir selalu hanya tata letak, dan menggantinya dengan tata letak lain tidak mengubah apa pun. Tetapi spasi di dalam konten campuran - teks dan elemen yang bersebelahan, seperti paragraf yang berisi satu kata tebal - adalah bagian dari teks, dan menyusunnya ulang berarti mengubah dokumen.

Karena itu, elemen yang berisi konten campuran dibiarkan persis seperti aslinya, meskipun meninggalkan satu baris panjang di tengah dokumen yang sudah diindentasi. Alternatifnya adalah yang dilakukan kebanyakan formatter: mengindentasi semuanya, menyisipkan baris baru di antara Hello dan <b>there</b>, dan menghasilkan dokumen yang tampil dengan celah yang sebelumnya tidak ada. Terlihat lebih rapi, tetapi salah.

Spesifikasi menyediakan xml:space="preserve" untuk menyatakan hal ini secara eksplisit, dan layak dipakai pada elemen yang isi teksnya penting. Perlu diingat bahwa atribut ini diwarisi oleh elemen turunan sampai ditimpa, sesuatu yang sering mengejutkan orang yang hanya memasangnya sekali di root.

Penyebab dokumen XML benar-benar rusak

Ampersand yang tidak di-escape adalah penyebab paling umum, jauh di atas yang lain. Dalam XML, & menandai awal referensi entitas, sehingga & mentah di query string URL atau nama perusahaan membuat dokumen tidak well-formed. Tulis sebagai &amp;, dan tanda kurang dari di dalam teks harus ditulis &lt;. Hanya ada lima entitas bawaan - amp, lt, gt, quot, dan apos - dan selebihnya harus dideklarasikan atau ditulis sebagai referensi karakter numerik.

Berikutnya adalah ketidakcocokan encoding. Deklarasi di awal file menyebutkan encoding byte-nya, dan jika file itu kemudian disimpan dengan encoding lain, parser akan membaca karakter multibyte sebagai karakter acak atau langsung gagal. BOM sebelum deklarasi juga membuat sebagian parser gagal. Selain itu, beberapa karakter kontrol sama sekali tidak diizinkan di XML 1.0, bahkan jika di-escape, sehingga data biner yang bocor ke kolom teks tidak bisa diselamatkan dengan encoding - harus dihapus atau dikodekan ke Base64.

Lalu ada kebiasaan dari HTML. Nilai atribut tanpa tanda kutip, tag yang tidak ditutup seperti <br>, dan atribut ganda semuanya boleh di HTML tetapi fatal di XML. Jika dokumen berasal dari sumber HTML, periksa hal-hal ini lebih dulu.

Entitas, dan catatan soal mem-parsing XML yang tidak tepercaya

XML memungkinkan dokumen mendeklarasikan entitasnya sendiri di dalam DTD, termasuk entitas eksternal yang menunjuk ke path file atau URL. Inilah dasar dua jenis serangan yang terkenal, dan keduanya perlu diketahui meskipun Anda hanya membaca XML dan tidak pernah menulisnya.

Injeksi entitas eksternal XML (XXE) memakai entitas yang menunjuk ke file lokal agar server membaca file itu dan mengembalikan isinya di respons - sejak lama menjadi cara andal untuk mencuri konfigurasi dan kredensial dari sistem apa pun yang mem-parsing XML unggahan dengan pengaturan bawaan. Serangan billion laughs menumpuk entitas sehingga masing-masing mengembang menjadi beberapa entitas berikutnya, dan beberapa kilobyte input membengkak menjadi gigabyte di memori.

Pertahanan untuk keduanya adalah menonaktifkan pemrosesan DTD dan resolusi entitas eksternal di parser. Kebanyakan pustaka modern sudah aman secara bawaan, tetapi banyak kode lama yang belum. Halaman ini tidak me-resolve apa pun dari luar: dokumen dibaca sebagai teks dan tidak pernah mengambil apa pun yang dirujuknya.

Namespace, dan mengapa prefiks bukanlah nama

Namespace mengikat sebuah prefiks ke sebuah URI, dan URI itulah yang mengidentifikasi elemen - prefiks hanyalah singkatan lokal yang bebas diganti namanya. Dua dokumen yang memakai soap: dan s: untuk URI yang sama adalah setara, sedangkan dua dokumen yang sama-sama memakai ns1: untuk URI yang berbeda tidak setara. Kode yang mencocokkan berdasarkan prefiks, bukan URI, akan berjalan mulus sampai ada orang yang memformat ulang dokumennya.

Namespace bawaan yang dideklarasikan dengan xmlns berlaku untuk elemen, tetapi tidak untuk atribut, dan inilah aturan yang paling sering disalahpahami. Atribut tanpa prefiks tidak termasuk namespace mana pun, apa pun yang dideklarasikan elemen yang membungkusnya - itulah sebabnya xsi:type dan xml:lang selalu ditulis dengan prefiks.

Ketika parser menolak dokumen yang tampak sudah benar bentuknya, penyebab umumnya adalah prefiks yang belum dideklarasikan. Proses pemformatan tetap berhasil, karena pengikatan prefiks adalah aturan namespace, bukan aturan sintaks, sehingga kegagalannya baru muncul belakangan di sisi yang mengonsumsi dokumen tersebut.

Validasi skema dan apa yang sebenarnya Anda dapat

Benar bentuknya itu soal sintaks; sah itu soal kesesuaian dengan sebuah tata bahasa. DTD adalah mekanisme paling awal, terbatas, dan masih dipakai untuk deklarasi entitas. XSD adalah yang dominan - ditulis dengan XML itu sendiri, ekspresif soal tipe data, dan begitu bertele-tele sampai membacanya pun sudah merupakan keterampilan tersendiri. RelaxNG jauh lebih enak ditulis tetapi dukungannya lebih sempit, pertukaran yang sudah biasa kita temui.

Yang Anda peroleh dari skema adalah kontrak yang bisa diperiksa secara mekanis di batas sistem, sebelum kode Anda melihat datanya: elemen wajib ada, angka berada di tempat yang seharusnya berisi angka, nilai enumerasi masih di dalam himpunannya. Dalam integrasi dengan mitra, skema sering kali menjadi satu-satunya spesifikasi yang disepakati kedua pihak.

Melakukan validasi di dalam pipeline cukup satu perintah - xmllint --schema schema.xsd file.xml --noout - dan pesan kesalahannya menunjuk langsung ke nomor baris dan elemen. Alasan mengerjakannya di tepi sistem alih-alih di dalam kode aplikasi adalah karena kegagalan skema berupa penolakan yang rapi dan disertai alasan, sementara masalah yang sama bila baru ketahuan tiga lapis ke dalam hanya akan menjadi stack trace.

Mengambil data dengan XPath

XPath adalah bahasa kueri untuk XML dan sepadan dengan satu jam waktu siapa pun. //book/title memilih setiap elemen title di bawah book di mana pun letaknya dalam dokumen; //book[@id='b1'] memilih berdasarkan atribut; //book[price>30]/title menyaring berdasarkan nilai elemen anak. Inilah bahasa pengalamatan yang ada di balik XSLT, perkakas XML di Java, lxml di Python, dan sebagian besar otomatisasi browser.

Namespace adalah titik ketika XPath menjadi merepotkan. Sebuah ekspresi harus mengikat sendiri prefiks yang dipakainya, dan pada dokumen yang punya namespace bawaan, elemen-elemennya tetap berada di namespace itu meski tampak tanpa prefiks - itulah sebabnya //book tidak cocok dengan apa pun dan XPath pertama siapa pun terhadap respons SOAP selalu kembali kosong. Cara mendaftarkan pengikatan itu berbeda-beda antarperkakas, dan fungsi local-name() adalah jalan keluar darurat yang kasar.

XSLT adalah bahasa transformasi yang dibangun di atasnya, dan sampai sekarang ia tetap cara paling praktis untuk mengubah satu kosakata XML menjadi kosakata lain - atau menjadi HTML - tanpa menulis kode prosedural. Reputasinya yang sulit lebih berkaitan dengan gaya fungsionalnya ketimbang sintaksisnya.

XML masih ada di mana-mana

Dokumen perkantoran adalah XML: sebuah .docx atau .xlsx sebenarnya arsip zip berisi satu direktori bagian-bagian XML, dan itulah sebabnya dokumen yang rusak kadang bisa diperbaiki dengan mengekstraknya lalu membetulkan satu berkas saja. SVG juga XML, jadi sebuah ikon bisa disunting dengan editor teks dan dihasilkan lewat template. Feed RSS dan Atom adalah XML, begitu pula sitemap yang diterbitkan situs ini.

Dalam integrasi di dunia korporat dan pemerintahan, SOAP masih jauh dari mati: perbankan, asuransi, layanan kesehatan lewat HL7, serta sistem bea cukai dan perpajakan di sebagian besar negara berjalan di atas XML dengan skema dan, sering kali, payload yang ditandatangani. XML Signature dan XML Encryption memungkinkan satu elemen saja ditandatangani di dalam dokumen yang lebih besar, sesuatu yang tidak punya padanan standar di JSON.

Layout Android, build Maven, konfigurasi .NET, dan tak terhitung berkas deskripsi CI juga berupa XML. Format ini sedang tidak populer, bukan usang, dan kemampuan membacanya dengan nyaman adalah keterampilan yang awet.

Mem-parsing XML yang bukan Anda yang menulis

Pengaturan bawaan banyak pustaka XML tidak aman untuk masukan yang tidak tepercaya, dan penyebabnya adalah mekanisme entitas. Entitas eksternal membuat sebuah dokumen bisa merujuk ke berkas lokal atau ke sebuah URL, sehingga server yang mem-parsing XML unggahan dengan pengaturan bawaan bisa disuruh membaca /etc/passwd lalu mengembalikannya - inilah serangan XXE, yang masih ditemukan di sistem produksi bertahun-tahun setelah didokumentasikan.

Sisi lainnya adalah ekspansi. Serangan billion laughs menyarangkan entitas sedemikian rupa sehingga masukan beberapa kilobita mengembang menjadi gigabita di memori dan menjatuhkan prosesnya. Kedua serangan ini tidak memerlukan hal yang aneh-aneh: keduanya XML biasa yang memakai fitur yang memang didefinisikan spesifikasinya.

Pertahanannya cukup satu baris di sebagian besar pustaka - matikan pemrosesan DTD dan resolusi entitas eksternal - dan itu layak dipastikan, bukan diasumsikan, karena nilai bawaannya berbeda-beda menurut bahasa dan versinya. Halaman ini sama sekali tidak me-resolve apa pun dari luar: ia membaca dokumen sebagai teks dan tidak pernah mengambil apa pun yang dirujuknya.

Pertanyaan umum

Kenapa sebagian XML saya tetap dalam satu baris?
Karena bagian itu berisi konten campuran - teks berdampingan dengan elemen, seperti pada "Hello <b>there</b>." Memberinya indentasi akan menyisipkan pergantian baris dan spasi ke dalam teksnya sendiri, sehingga saat ditampilkan menjadi "Hello there ." dengan celah berlebih. Karena itu elemen tersebut dibiarkan persis seperti ditulis. Sebagian besar pemformat XML tetap menata ulangnya dan diam-diam mengubah dokumen Anda.
Apakah merapikan bisa mengubah makna dokumen saya?
Tidak, dan itulah inti aturan di atas. Spasi di antara elemen adalah tata letak sehingga diganti; spasi di dalam konten campuran adalah data sehingga dipertahankan. Urutan dan gaya tanda kutip atribut dijaga apa adanya, komentar dan CDATA disalin utuh, dan deklarasi XML tidak ditambahkan bila dokumen aslinya tidak punya.
Apa saja yang sebenarnya diperiksa oleh "bentuk benar"?
Bahwa setiap elemen ditutup oleh tag yang cocok, nilai atribut diapit tanda kutip, komentar dan blok CDATA diakhiri, serta ada tepat satu elemen akar tanpa teks liar di luarnya. Alat ini tidak memvalidasi terhadap DTD atau skema - itu memerlukan skemanya sendiri dan merupakan alat yang berbeda.
Kenapa atribut saya ditolak?
XML mewajibkan tanda kutip pada setiap nilai atribut. HTML membolehkan Anda menulis disabled=true atau width=100 dan peramban tetap memahaminya, tetapi XML tidak, dan semua parser berikutnya akan menolaknya. Jika dokumennya berasal dari sumber HTML, biasanya inilah yang pertama perlu diperbaiki.
Apa beda memperkecil dan merapikan?
Keduanya operasi berlawanan atas dokumen yang sama. Merapikan menyisipkan pergantian baris dan indentasi di antara elemen agar bisa dibaca; memperkecil membuang semuanya supaya dokumen sekecil mungkin saat dikirim. Keduanya tidak menyentuh konten campuran, jadi menjalankan yang satu lalu yang lain akan mengembalikan Anda ke titik awal.
Apakah XML saya diunggah ke suatu tempat?
Tidak. Penguraian dan perapiannya terjadi di peramban Anda, jadi berkas konfigurasi, payload SOAP, dan hasil ekspor - yang sering memuat nama host internal, pengenal, dan data pribadi - tidak pernah keluar dari perangkat Anda.

Terakhir diperbarui:

Laporkan masalah

Sertakan langkah, hasil yang diharapkan, dan hasil sebenarnya. Hapus rahasia dan data pribadi.

Alat terkait