Memecahkan Masalah Format Dokumen Ada lusinan, bahkan ratusan, resep dalam daftar ibu saya. Jika terjadi kesalahan fatal, proses debug akan sangat sulit - Anda akan mencari penanda yang hilang baris demi baris. Jika Anda menggunakan beberapa level bersarang, akan sulit menemukan kesalahan.
Namun bantuan yang baik dapat ditemukan. Parser - Aplikasi yang mengurai kode XML dan melaporkan kesalahan format tersedia gratis secara online. Yang terbaik adalah Lark, yang ditulis oleh Tim Bray - editor teknis dan pendukung vokal spesifikasi XML, salah satu orang terpintar di planet ini.
Saya menggunakan Lark untuk menganalisis kode di bawah ini. Perhatikan bahwa "chocolate chips" dan tag penutupnya muncul di posisi yang salah dalam tag </ingredients>:
<?xml version="1.0"?>
<list>
<recipe>
<author>Carol Schmidt</author>
<recipe_name >Chocolate Chip Bars</recipe_name>
<meal>Makan malam
<course>Makanan penutup</course>
</meal>
<bahan>
<item>2/3 C mentega</item>
<item>2 C gula merah</ item>
<item>1 sdt vanila</item>
<item>1 3/4 C tepung serbaguna yang belum diayak</item>
<item>1 1/2 sdt baking powder</item>
<item>1/2 sdt garam< /item>
<item>3 butir telur</item>
<item>1/2 C kacang cincang</item>
<item>
</bahan>2 cangkir (12 ons pkg.)
keripik coklat semi manis< /item >
<petunjuk>
Panaskan hingga 350 derajat. Lelehkan mentega;
campurkan dengan gula merah dan vanila dalam mangkuk besar.
Sisihkan
hingga dingin. Campurkan tepung, baking powder, dan garam, sisihkan
. Masukkan
bahan-bahan kering, kacang-kacangan, dan keripik yang sudah disiapkan.
Oleskan
ke
dalam loyang berukuran 13 kali 9 inci yang sudah diolesi minyak. Panggang selama 25 hingga 30 menit
hingga
berwarna cokelat keemasan.
list>
Berikut adalah hasil yang dikembalikan oleh penganalisis:
Laporan Kesalahan
Baris 17, kolom 22: Ditemukan </bahan> yang diharapkan </item>
... diasumsikan </item>
Baris 18, kolom 36: Ditemukan </item> dengan tidak ada tag awal.
Dengan informasi ini, menemukan kesalahan tidak akan menjadi masalah. Jadi apa arti validitas file XML?
Penerapan Efektivitas Pada akhirnya kita akan menambahkan informasi ke dokumen XML yang terorganisir dengan baik. Sebenarnya, banyak yang harus kita lakukan - masih ada krisis yang mengintai - dan meskipun file XML sudah terorganisir dengan baik,
Namun informasi penting juga bisa hilang. Perhatikan contoh berikut:
<resep>
<penulis>Carol Schmidt</penulis>
<recipe_name>Cokelat Batangan</recipe_name>
<makan>Makan Malam <kursus>Makanan penutup</kursus> </makan>
<bahan> </bahan>
<directions>Lelehkan mentega; kombinasikan dengan, dll. ... </directions>
</resep>
Resep ini tidak menyertakan bahan-bahan, dan karena disusun dengan sangat baik,
Penganalisis Lark juga tidak akan menemukan masalahnya. Siapa pun yang pernah mengelola database yang paling sederhana pun pasti tahu kesalahan yang kita lakukan sebagai manusia: jika ada kesempatan, kita membuang informasi penting dan menambahkan omong kosong yang tidak berguna. Itu sebabnya penemu XML memperkenalkan DTD -
Definisi Jenis Dokumen. DTD menyediakan cara untuk memastikan bahwa XML kurang lebih sesuai dengan yang Anda inginkan.
Mari kita lihat DTD yang digunakan dalam resep.
<!Daftar DOCTYPE [
<!ELEMENT resep (nama_resep, penulis, makanan, bahan, petunjuk arah)>
<!Bahan ELEMEN (item+)>
<!ELEMEN makanan (#PCDATA, kursus?)>
<!ELEMENT item (#PCDATA, sub_item*)>
<!ELEMENT nama_resep (#PCDATA)>
<!ELEMENT penulis (#PCDATA)>
<!KURSUS ELEMEN (#PCDATA)>
<!Item ELEMEN (#PCDATA)>
<!Subitem ELEMEN (#PCDATA)>
<!Petunjuk ELEMEN (#PCDATA)>
]>
Kode ini mungkin tampak tidak bersahabat pada awalnya, tetapi masuk akal ketika Anda menguraikannya. Mari kita jelaskan secara detail:
<!DOCTYPE list [
Baris ini menyatakan bahwa yang diapit tanda kurung siku adalah dokumen dengan elemen root <list>
DTD. Seperti yang kami sebutkan sebelumnya, elemen root berisi semua elemen lainnya.
<!ELEMENT resep (nama_resep, makanan, bahan, petunjuk arah)>
Baris ini mendefinisikan tag <resep>. Tanda kurung berarti keempat tag tersebut harus muncul di tag <recipe> secara berurutan.
<!ELEMENT food (#PCDATA, course?)>
Baris ini memerlukan penjelasan mendetail. Saya telah mendefinisikan struktur berikut:
<meal>Di sini nama makanan wajib diisi
<course>Satu nama kursus mungkin muncul, namun sebenarnya tidak
wajib</tentu saja>
</makan>
Saya melakukan ini karena, menurut saya, makan siang tidak harus berupa hidangan tertentu, tetapi makan malam mungkin mengacu pada makanan pembuka, hidangan utama, dan hidangan penutup. Dengan menentukan
#PCDATA - Mewakili data karakter yang diurai (yaitu data non-biner) untuk mengimplementasikan fungsi ini. Di sini, #PCDATA adalah teks - misalnya, "makan malam".
Tanda tanya setelah "course" menunjukkan bahwa 0 atau 1 pasang tag <course> akan muncul di <meal>
dalam penanda.
Sekarang mari kita lihat baris berikutnya:
<!ELEMENT bahan (item+)>
Tanda plus di sini menunjukkan bahwa setidaknya sepasang tag <item> harus muncul di <ingredients>
dalam penanda.
Baris terakhir yang kami minati adalah:
<!ELEMENT item (#PCDATA, sub_item*)>
Saya menempatkan sub_item* sebagai tindakan pengamanan. Selain menanyakan teks setiap item, saya ingin menghitung jumlah konten setiap item. Tanda bintang menunjukkan jumlah sub-item yang dapat dimasukkan ke dalam tag <item>. Saya tidak memerlukan sub-item apa pun untuk resep Chocolate Chip Bars, tapi ini berguna jika bahan-bahannya rumit.
Sekarang mari kita gabungkan ini dan lihat apa yang kita dapatkan.
Contoh DTD Lengkap Di bawah ini adalah contoh lengkapnya. Saya menambahkan resep lain ke file dan menambahkan
DTD dijelaskan. Anda dapat melihat bahwa saya menggunakan sub item di resep kedua.
<?xml versi="1.0"?>
<!--Ini memulai DTD. Empat baris pertama alamat struktur dokumen-->
<!Daftar DOCTYPE]
<!ELEMENT resep (nama_resep, penulis, makanan, bahan, petunjuk arah)>
<!Bahan ELEMEN (item+)>
<!ELEMEN makanan (#PCDATA, kursus?)>
<!ELEMENT item (#PCDATA, sub_item*)>
<!--Ini adalah elemen yang tersisa dari tag resep -->
<!ELEMENT nama_resep (#PCDATA)>
<!ELEMENT penulis (#PCDATA)>
<!Petunjuk ELEMEN (#PCDATA)>
<!--Elemen sisa label makanan -->
<!KURSUS ELEMEN (#PCDATA)>
<!--Elemen yang tersisa dari tag item -->
<!Sub_item ELEMENT (#PCDATA)>
]>
<?xml versi="1.0"?>
<daftar>
<resep>
<penulis>Carol Schmidt</penulis>
<recipe_name>Cokelat Batangan</recipe_name>
<makan>Makan malam
<course>Makanan penutup</course>
</makan>
<bahan>
<item>2/3 C mentega</item>
<item>2 C gula merah</item>
<item>1 sdt vanila</item>
<item>1 3/4 C tepung serbaguna yang tidak diayak</item>
<item>1 1/2 sdt baking powder</item>
<item>1/2 sdt garam</item>
<item>3 butir telur</item>
<item>1/2 C kacang cincang</item>
<item>2 cangkir (12 ons pkg.) keripik semi-sweetchoc.</item>
</bahan>
<arah>
Panaskan oven hingga 350 derajat.
kombinasikan dengan gula merah dan vanila dalam mangkuk besar.
Sisihkan hingga dingin. Campurkan tepung, baking powder, dan garam;
sisihkan. Tambahkan telur ke dalam campuran gula dingin; kocok rata.
Masukkan bahan kering, kacang-kacangan, dan keripik yang sudah dipesan.
Sebarkan dalam loyang berukuran 13 kali 9 inci yang sudah diolesi minyak.
Panggang selama 25 hingga 30 menit sampai berwarna cokelat keemasan;
Potong menjadi kotak.
</arah>
</resep>
<resep>
<recipe_name>Pasta dengan saus tomat</recipe_name>
<makan>Makan malam
<course>Makanan utama</course>
</makan>
<bahan>
<item>1 pon spageti</item>
<item>1 kaleng tomat potong dadu berukuran 16 ons</item>
<item>4 siung bawang putih</item>
<item>1 bawang bombay potong dadu</item>
<item>bumbu Italia
<sub_item>oregano</sub_item>
<sub_item>kemangi</sub_item>
<sub_item>cabai merah tumbuk</sub_item>
</barang>
</bahan>
<arah>
Rebus pasta. Tumis bawang putih dan bawang bombay.
Tambahkan tomat. Sajikan panas.
</arah>
</resep>
</daftar>
Sekarang setelah ada DTD, dokumen tersebut akan diperiksa apakah sesuai dengan batasan yang ditetapkan oleh DTD. Dengan kata lain, kami ingin memastikan keabsahan dokumen tersebut.
Untuk mencapai hal ini, kita memerlukan alat lain: penganalisis validitas. MSXML Microsoft, program berbasis Java, mudah digunakan dan berfungsi dengan baik. Dokumen di atas telah diperiksa oleh program ini dan tidak ditemukan kesalahan. Tetapi jika saya memeriksa a
Resep yang tidak mengandung item dalam tag bahan akan menampilkan pesan berikut:
bahan tidak lengkap.