Meskipun XML sangatlah fleksibel, namun tidak semua program
dapat membaca dokumennya secara baik. Banyak program yang dapat bekerja
dengan beberapa aplikasi XML tetapi terkadang tidak untuk yang lain. Aplikasi
XML harus memastikan bahwa dokumen yang diberikan adalah benar-banar mematuhi
aturan. Misalnya didalam XHTML, pada elemen li merupakan child dari elemen ol. Dalam
hal ini, apakan li atau ul tersebut merupakan bagian dari tag XML ataukah
elemen isi. Solusi untuk permasalahan seperti itu adalah dengan menggunakan
DTD. DTD berfungsi untuk mendefinisikan tipe dokumen XML. DTD ditulis untuk
menjelaskan elemen dan entitas yang mungkin muncul di dalam dokumen dan elemen
isi serta atributnya. Sehingga kita tahu bahwa seperti apa struktur dokumen dan
dapat membedakan yang mana tag dan yang mana elemen.
Validation
Dokumen yang valid termasuk jenis dokumen mendeklarasikan
DTD. DTD yang mengandung selua elemen, atribut, dan entitas yang akan digunakan
didalam dokumen. Validitas operasinya pada prinsipnya bahwa semua yang tidak
diperbolehkan adalah dilarang. Semua dokumen yang akan ditulis harus
dideklarasikan didalam DTD. Jika pada suatu dokumen terdapat deklarasi DTD,
maka mau tidak mau isi dari dokumen yang akan ditulis harus sesuai dengan
DTDnya. Jika dokumen yang ditulis tersebut telah sesuai, maka dokumen tersebut
dapat dikatakan valid, jika tidak maka dokumen tersebut tidak valid.
Selain itu, banyak hal-hal yang ditak diulas DTD,
diantaranya :
1. Apa
yang menjadi root element dari dokumen.
2. Berapa kasus dari tiap-tiap elemen yang muncul di
dalam dokumen.
3. Karakter
data apa yang tampak didalam elemen.
4. Semanting
yang berarti dari sebuah elemen, apakah mengandung data tanggal atau nama
orang.
DTD memungkinkan untuk penempatan beberapa kostrain pada
form sebuah dokumen XML. Parser membaca apakah dokumen tersbut valid atau
tidak. Jika dokumen tersebut valid, maka program akan menerima data dari parser.
Dalam beberapa kasus, seperti memasukan record
kedalam database, validation error mungkin cukup serius, sehingga field yang
dibutuhkan hilang. Contoh sederhana penggunaan DTD :
<!DOCTYPE person [
<!ELEMENT person (name, profession*)>
<!ELEMENT name (first_name, last_name)>
<!ELEMENT first_name
(#PCDATA)>
<!ELEMENT
last_name (#PCDATA)>
<!ELEMENT profession
(#PCDATA)>
]>
<person>
<name>
<first_name>Alan</first_name>
<last_name>Turing</last_name>
</name>
<profession>mathematician</profession>
<profession>cryptographer</profession> </person>
pada contoh diatas maksudnya adalah person menjadi
elemen root dimana didalam elemen person harus ditulis satu kali
element name
dan elemen profession
boleh muncul atau boleh tidak. Sedangkan pada elemen name harus memiliki
dua elemen child yaitu first_name,
last_name
dan kemunculannya msing-masing satu kali. Sedangkan (#PCDATA)
menunjukan tipe isi dari elemen yaitu data karakter.
Contoh:
<!DOCTYPE person [
<!ELEMENT person (student+)>
<!ELEMENT
student (name, hobbi | favorite)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT hobbi (#PCDATA)>
<!ELEMENT
favorite (#PCDATA)>
]>
<person>
<student>
<name>Alan
Turing</name>
<hobbi>Tenis</hobbi>
</student>
<student>
<name>Johan</name>
<favorite>Arktis</favorite>
</student>
<student>
<name>Marie</name>
<hobbi>Tenis</hobbi>
<favorite>Arktis</favorite>
</student>
</person>
Pada contoh diatas, terdapat tanda “ | ” diantara hobbi dan faforite. Maksudnya adalah
didalam elemen student wajib mengandung satu elemen nama dan boleh salah
satu dari elemen hobbi atau faforite yang muncul atau
keduanya muncul.
Selain itu, dokumen yang valid juga memasukan sebuah
reference kedalam DTD yang harus dibandingkan disajikan dalam dokumen dari satu
jenis dokumen deklarasi. Ini berguna jika kita menuliskan DTDnya didalam file
yang terpisah dengan dokumen. Contoh deklarasi dokument type adalah :
<!DOCTYPE person SYSTEM
"http://www.politekniktelkom.ac.id/person.dtd">
<person>
<name>
<first_name>Alan</first_name>
<last_name>Turing</last_name>
</name>
<profession>mathematician</profession>
<profession>cryptographer</profession>
</person>
sintaks tersebut dituliskan didalam dokumen XML dan DTDnya
berada diluar serve.
Element Declarations
Setiap elemen yang digunakan dalam dokumen yang valid harus
dinyatakan dalam dokumen DTD dengan elemen deklarasi. Deklarasi elemen meniliki
bentuk dasar :
<!ELEMENT element_name content_specification>
adapun beberapa hal yang merupakan bagian dari elemen
declaration adalah :
#PCDATA
Konten yang terkandung didalam
elemen yang dimaksud adalah text. Meskipun data yang ada dielemen tersebut
berupa angka, tetap dianggap sebagai text. Contohnya :
<!ELEMENT
phone_number (#PCDATA)>
Elemen anak
Penspesifikasi konten sederhana
adalah salah satu elemen yang harus memiliki satu anak dari type yang sesuai.
Pada kasus ini, nama anak ditulis didalam kurung. Contohnya :
<!ELEMENT
fax (phone_number)>
Maksudnya adalah elemen phone_number
merupakan anak dari elemen fax.
Sequence
Kita dapat menuliskan elemen anak
lebih dari satu pada deklarasinya. Dengan penulisan ini dimaksudkan untuk
menuliskan elemen anak lebih dari satu elemen. Misalnya :
<!ELEMENT
name (first_name, last_name)>
Jumlah anak
Penulisan jumlah anak daru suatu
elemen dapat kita tuliskan dengan cara menambahkan tanda berikut pada akhir
nama elemen.
Karakter
|
Arti
|
+
|
Muncul saatu kali atau
lebih. Minimal muncul satu kali
|
*
|
Muncul 0 kali atau lebih
|
?
|
Boleh tidak muncul, tapi jika muncul maksimal satu kali
|
|
|
Fungsi atau
|
Contoh penggunaannya adalah
sebagai berikut :
<!ELEMENT
people (phone_number*)>
artinya elemen people
boleh memiliki satu atau lebih elemen phone_number atau bisa juga
kosong.
Pilihan
Terkadang pada kasus tertentu ada
suatu elemen yang memiliki anak tetapi berbeda-beda. Cara pendeklarasiannya
dapat dilakukan dengan :
<!ELEMENT
methodResponse (params | fault)>
penulisannya tidak hanya dibatasi
dua elemen saja, tetapi kita dapat menuliskan lebih dari itu.
Parentheses
Dari
yang telah kita bahas choices, sequences, dan suffixes sangat tebatas penggunaannya, oleh
karena itu kita dapat pula
manggabungkannya dari masing-masing bagian tadi. Misalnya :
<!ELEMENT
circle (center, (radius | diameter))>
Atau
<!ELEMENT
center ((x, y) | (y, x) | (r, θ) |
(θ, r) )>
Mixed
Content
Dimana kita memungkinkan untuk
menulsikan text dan elemen dalam suatu elemen. Contoh :
<definition>The
<term>Turing Machine</term> is an abstract finite state automaton
with infinite memory that can be proven equivalent to any any other finite
state automaton with arbitrarily large memory. Thus what is true for a Turing
machine is true for all equivalent machines no matter how implemented.
</definition>
dimana deklarasi elemen adalah :
<!ELEMENT
definition (#PCDATA | term)*>
Elemen
Kosong
Elemen kosong adalah sebuah tag
yang tidak memiliki elemen nilai. Penulisannya dapat berupa :
<image
source="bus.jpg" width="152" height="345" alt="Alan Turing standing in front of
bus"/>
dengan deklarasi elemennya :
<!ELEMENT
image EMPTY>
ANY
Kita dapat mengijinkan apapun
dapat berada pada suatu elemen. Penulisan deklarasinya adalah :
<!ELEMENT
page ANY>
Deklarasi Atribut
Seperti halnya elemen, dokumen dikatakan valid jika dapat
menyatakan semua atribut elemen jika elemennya memiliki atribut. Yaitu sintaks
ATTLIST dapat mendeklarasikan beberapa atribut dalam suatu elemen.
Contoh berikut merupakan pendeklarasian ATTLIST pada elemen
imaeg, dimana elemen image memiliki atribut source :
<!ATTLIST image source CDATA #REQUIRED>
atau kita dapat menuliskan lebih dari satu atribut didalam
suatu elemen :
<!ATTLIST
image source CDATA #REQUIRED
width CDATA #REQUIRED height CDATA #REQUIRED alt
CDATA #IMPLIED
>
maksud dari deklarasi diatas adalah elemen image memiliki
atribut source, width, height dan alt. Dengan type CDATA.
Type Atribut
Type atribut yang ada didalam XML adalah :
CDATA
Atribut yang hanya memiliki nilai text string.
NMTOKEN
Type atribut yang mengandung
token XML name yang dipisahkan dengan spasi
<performances
dates="08-21-2001">
Kat and the Kings
</performances>
NMTOKENS
Type atribut yang mengandung satu
atau lebih token XML name yang dipisahkan dengan spasi
<performances
dates="08-21-2001 08-23-2001 0827-2001">
Kat and the Kings
</performances>
Enumeration
Atribut yang bukan merupakan
keyword XML.
<!ATTLIST date month (January |
February | March | April | May | June |
July | August | September | October | November | December)
#REQUIRED
>
ID
Sebuah type atribut ID harus berisi XML name yang unik
didalam dokumen.
IDREF
Mengacu pada type atribut ID dari beberapa elemen.
IDREFS
Mengandung spasi sebagai pemisah dan masing-masing harus
mengacu pada ID dari elemen didalam dokumen itu sendiri.
ENTITY
Berisi name dari sebuah deklarasi entity unparsed di DTD
ENTITIES
Berisi name dari satu atau lebih deklarasi entity unparsed
di DTD
NOTATION
Mengandung deklarasi notasi
didalam DTD
Atribut Default
#IMPLIED
Tidak disediakan nilai default,
jika kita mengisi nilai tersebut, maka nilai atribut elemen menjadi sesuai yang
dituliskan, jika kita tidak memberikan nilai atributnya, maka nilai atributnya
menjadi kosong.
#REQUIRED
Merupakan default atribut.
Artinya tidak disediakan nilai default untuk atribut, jadi nilainya harus
diisi, jika tidak maka parser akan menampilkan pesan error.
#FIXED
Disediakan nilai default dan jika kita mengisikan nilai
atribut pada elemen, maka nilainya akan samadengan yang diisikan, sedangkan
jika dokosongkan maka parser akan mengenali nilai atributnya sesuai dengan
nilai default yang diberikan.
General Entity Declarations
Referensi entitas didefinisikan dengan pendeklarasian sebuah
ENTITY didalam DTD. Hal ini diberikan guna memberikan nama pada entiti. Dengan
kata lain, kita bisa menggantikan kalimat yang panjang atau satu blok elemen
yang sering kita gunakan dengan sebuah pengenal singkat. Dengan adanya
pendeklarasian entiti yang sesuai, kita dapat menuliskan text atau string
apapun hanya dengan menuliskan entity referencenya saja yang telah
dideklarasikan tampa harus menulis text tersebut secara utuh. Misalnya
deklarasi entity mendefinisikan &email;
sebagai singkatan dari “admin@somethingweb.com”, maka contoh penulisannya :
<!ENTITY email "admin@somethingweb.com">
<person>
<name>Peter Kok
kok</name>
<email>&email;</email>
</person>
External Parsed General Entities
Pada umumnya situs-situs web yang beredar lebih memilih
menyimpan konten yang akan tampil berulang kedalam file external yang kemudian
akan ditampilkan kehalaman webnya menggunakan PHP atau bahasa pemprograman web,
termasuk server-site atau mekanisme yang lainnya. Dalam hal ini, XML mendukung
teknik tersebut melalui external general
entity references meskipun dalam hal ini client bukanlah sebagai server.
External general
entity references dideklarasikan didalam DTD yang menggunakan
pendeklarasian ENTITY. Contohnya :
<!ENTITY footer SYSTEM
"http://www.oreilly.com/boilerplate/footer.xml">
atau kita juga dapat memasukan relative URL. Misalnya :
<!ENTITY footer SYSTEM
"/boilerplate/footer.xml">
External Unparsed Entities and Notations
Tidak semua data itu XML. Terdapat banyak file ASCII didunia
ini yang tidak memberikan arti tentang “<” sebagai < atau kendala
lainnya yang pada dokumen XML yang terbatas. Pada dokumen JPEG photographs, GIF
line art, QuickTime movies, MIDI sound files, dan sebagainya yang merupakan
komponen penting dari berbagai macam komponen namun tidak dapat
diimplementasikan menjadi dokumen XML. Namun mekanisme embeded XML menyarankan
untuk menggunakan External Unparsed Entities yang dapat didefinisikan kedalam
DTD sebagai entitas yang bukan dokumen XML. Misalnya pendeklarasian ENTITY yang
mengasisiasikan nama turing_getting_off_bus dengan gambar JPEG pada
http://www.turing.org.uk/turing/pi1/bus.jpg :
<!ENTITY turing_getting_off_bus SYSTEM
"http://www.turing.org.uk/turing/pi1/bus.jpg" NDATA jpeg>
Notifikasi
Ini digunakan agar dokumen XML
dapar mengenali file yang akan dimasukan, misalnya dengan memberikan penamaan
jpeg pada file JPEG image. Contoh :
<!NOTATION
jpeg SYSTEM "image/jpeg">
Meletakan Unparsed Entities didalam dokumen
Namun kita tidak bisa menempatkan
entity reference, entitas reference hanya dapat merujuk ke parsed entities.
Misalnya elemen image dan
deklarasi atribut seperti :
<!ELEMENT
image EMPTY>
<!ATTLIST
image source ENTITY #REQUIRED>
kemudian elemen gambar ini akan
merujuk pada http://www.turing.org.uk/turing/pi1/bus.jpg
<image
source="turing_getting_off_bus"/>
Notifikasi untuk target pemprosesan instruksi
Notasi dapat juga dapat digunakan
untuk mengidentifikasi target yang tepat dari instruksi proses. Notasi dapat
mengidentifikasi nama singkat XML dengan spesifikasi lebih lengkap. Misalnya
targer path :
<!NOTATION
tex SYSTEM "/usr/local/bin/tex">
Parameter Entities
tidak dapat digunakan pada multiple elemen untuk men-share
semua atau sebagian untuk atribut yang sama. Misalnya adda elemen simpel XLink
yang dijadikan xlink:type and atribut xlink:href, dan mungkin xlink:show and
atribut xlink:actuate.
Misalnya, aplikasi XML untuk perumahan daftar real-estate yang menyediakan elemen
terpisah untuk apartemen, sublets, coops untuk penjualan, Condos untuk dijual,
dan rumah untuk dijual. Elemen deklarasi mungkin terlihat seperti ini:
<!ELEMENT apartment (address, rooms, baths, rent)>
<!ELEMENT sublet
(address, rooms, baths, rent)>
<!ELEMENT coop
(address, rooms, baths, price)>
<!ELEMENT condo
(address, rooms, baths, price)>
<!ELEMENT house
(address, rooms, baths, price)>
Parameter Entity Syntax parameter
entity reference banyak dinyatakan pada general entitas reference. Namun, tanda
persen (%) ditempatkan diantara <!ENTITY dan nama entitas.
<!ENTITY
% residential_content "address, footage, rooms, baths">
<!ENTITY
% rental_content
"rent">
<!ENTITY
% purchase_content
"price">
Parameter entity yang ditulis
kembali sebagai general reference, hanya dengan tanda persen.
<!ELEMENT
apartment (%residential_content;,
%rental_content;)>
<!ELEMENT
sublet (%residential_content;,
%rental_content;)>
<!ELEMENT
coop (%residential_content;,
%purchase_content;)>
<!ELEMENT
condo (%residential_content;, %purchase_content;)>
<!ELEMENT
house (%residential_content;,
%purchase_content;)>
Redefining
Parameter Entities
Jika dokumen menggunakan both internal maupun eksternal DTD
subset, maka subset internal DTD dapat menentukan teks untuk entity. Jika
ELEMENT dan ATTLIST dideklarasi di luar subset DTD ditulis langsung dengan
parameter entitas reference.
<!ENTITY % residential_content
"address, footage, rooms, bedrooms, baths, available_date">
External
DTD Subsets
Entitas parameter external
dideklarasikan menggunakan normal ENTITY dengan tanda %. Contoh, deklarasi
ENTITY mendefinisikan sebuah konten eksternal entitas yang disebut names yang kontennya diambil dari file names.dtd. Kemudian entitas parameter
referensi %name; memasukkan isi file ke dalam DTD.
<!ENTITY
% names SYSTEM "names.dtd">
%names;
Conditional Inclusion
XML memberikan IGNORE derektif untuk tujuan
"commenting out" sebuah
selection deklarasi. Misalnya parser akan mengabaikan deklarasi dari elemen production_note
:
<![IGNORE[
<!ELEMENT
production_note (#PCDATA)>
]]>
Sintaks diatas sepertinya tidak berguna, karena kita bisa
saja menggunakan komentar. Namun tujuan ini adalah untuk menunjukan bahwa
deklarasi yang diberikan benar-benar digunakan didalam DTD. Contoh :
<![INCLUDE[
<!ELEMENT
production_note (#PCDATA)>
]]>
Dua contoh DTD
Data-Oriented DTDs
Membuat penggunaan sequences
menjadi lebih berat. Kadang penggunaan pilihan dan hampir tidak ada penggunaan mixed content.
Narrative-Oriented DTDs
Cendrung bebas dan membuat lebih
banyak menggunakan mixed conten menjadi DTD yang mendeskripsikan dokumen
database-like lainnya.
Menempatkan Standar DTD
DTD dan validity merupakan hal yang sangat penting ketika
kita hendak mengganti data dengan yang lainnya. Hal ini untuk memastikan kita
apakah data yang kita kirim diterima dengan baik.
No Response to "Document Type Definitions (DTD) dan Validation pada XML"
Posting Komentar