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
digunakan untuk mendeklarasikan semua elemen, atribut, dan entitas yang akan digunakan didalam dokumen. Semua
dokumen yang
akan ditulis harus dideklarasikan
didalam DTD.
Sebagai contoh, buatlah dokumen XML beririkut yang menyertakan deklarasi
DTD. Simpan
file tersebut dengan
nama
contoh3_1.xml.
<?xml
version=”1.0” encoding=”UTF-8”
standalone=”yes” ?>
<!DOCTYPE
orang [
<!ELEMENT orang (nama, profesi)>
<!ELEMENT nama (nama_depan, nama_belakang)>
<!ELEMENT nama_depan
(#PCDATA)>
<!ELEMENT
nama_belakang (#PCDATA)>
<!ELEMENT profesi (#PCDATA)>
]>
<orang>
<nama>
<nama_depan>Hendra</nama_depan>
<nama_belakang>Kusmayadi</nama_belakang>
</nama>
<profesi>Dosen</profesi>
</orang>
Pada contoh diatas, jika kita menjalankan dokumen diatas, maka tampilan tidak akan berbeda dengan
tidak menggunakan DTD.
Tampilan yang ada dapat kita lihat seperti berikut :
Mengapa
bisa demikian...? Seperti yang telah kita bahas sebelumnya, bahwa
DTD tidak mempengaruhi ke well-formed-an
suatu dokumen. Sehingga dokumen diatas dianggap dokumen yang well-formed. Namun, meski demikian,
dokumen selain memiliki sifat well-formed, juga memiliki valid atau tidak.
Dengan DTD ini kita akan mengetahui bahwa sebuah dokumen valid atau
tidak. Untuk menyatakan suatu dokumen falid
atau tidaknya, kita memerlukan alat bantu atau tools XML validation yang
dapat didownload di http://msdn.microsoft.com/xml atau http://xmlsoftware.com atau
disitus lainnya. Dalam hal ini penulis menggunakan software IEXMLTLS yang
dapat digunakan
pada browser Microsoft Internet Explorer. Atau sekarang kita sepakati saja
bahwa
kita menggunakan IEXMLTLS untuk validasi dokumen
XML.
Instal file
tesebt dan arahkan lokasi intalnya pada drive C. selanjutnya buka folder C:\IEXMLTLS dan klik kanan pada
file
msxmlval.inf kemudian pilih instal.
Lakukan hal yang sama
pada file msxmlvw.inf. Jika kita
ingin memvalidasi
dokumen, kita hanya
dengan mengklik kanan pada space kosong pada IE dan pilih
Validated XML (IEXMLTLS hanya bisa digunakan pada Microsoft Internet Explorer).
Deklarasi Elemen
Jika
dokumen tersebut
diatas dijalankan,
dan
kita memvalidasinya,
maka
tampak seperti gambar dibawah
ini :
Sekarang kita
akan
melihat
dokumen
yang tidak
valid dengan mengubah
dokumen menjadi :
<?xml version=”1.0”
encoding=”UTF-8”
standalone=”yes” ?>
<!DOCTYPE orang [
<!ELEMENT orang (nama, profesi)>
<!ELEMENT nama (nama_depan, nama_belakang)>
<!ELEMENT nama_depan
(#PCDATA)>
<!ELEMENT nama_belakang (#PCDATA)>
<!ELEMENT profesi (#PCDATA)>
]>
<orang>
<nama>
<nama_depan>Hendra
Kusmayadi</nama_depan>
</nama>
<profesi>Dosen</profesi>
</orang>
Jika kita menvalidasi dokumen tersebut, maka akan tampak seperti
berikut :
Pada contoh diatas, validasi menjadi error karena
pada DTDnya elemen nama harus berisi elemen nama_depan dan nama_belakang.
Agar dokumen
tersebut valid, maka pada DTDnya kita dapat dengan mengganti tanda koma
(,) menjadi “|” sehingga kodenya menjadi :
<?xml
version=”1.0” encoding=”UTF-8”
standalone=”yes” ?>
<!DOCTYPE
orang [
<!ELEMENT orang (nama, profesi)>
<!ELEMENT nama (nama_depan | nama_belakang)>
<!ELEMENT nama_depan
(#PCDATA)>
<!ELEMENT nama_belakang (#PCDATA)>
<!ELEMENT profesi
(#PCDATA)>
]>
<orang>
<nama>
<nama_depan>Hendra
Kusmayadi</nama_depan>
</nama>
<profesi>Dosen</profesi>
</orang>
Jika dijalankan dokumen akan tampak seperti
berikut :
Jika kita mengubah
isi dokumen tersebut menjadi
:
<?xml version=”1.0”
encoding=”UTF-8”
standalone=”yes”
?>
<!DOCTYPE orang [
<!ELEMENT orang (nama, profesi)>
<!ELEMENT nama (nama_depan | nama_belakang)>
<!ELEMENT nama_depan
(#PCDATA)>
<!ELEMENT
nama_belakang (#PCDATA)>
<!ELEMENT profesi (#PCDATA)>
]>
<orang>
<nama>
<nama_depan>Hendra
Kusmayadi</nama_depan>
</nama>
<profesi>Dosen</profesi>
<profesi>Pedagang</profesi>
</orang>
Maka jika kita validasi akan error,
tampak seperti berikut :
Pada dokumen diatas
yang
membuat validasinya gagal adalah karena elemen
profesi ditulis dua
kali, sedangkan pada deklarasinya
hanya sekali. Agar sebuah elemen dapat kita
tulis berulang, maka kita dapat menambahkan karakter *, +
atau ?.
Jika dokumen diatas diubah
menjadi :
<?xml
version=”1.0” encoding=”UTF-8”
standalone=”yes” ?>
<!DOCTYPE
orang [
<!ELEMENT orang (nama, profesi*)>
<!ELEMENT nama (nama_depan | nama_belakang)>
<!ELEMENT nama_depan (#PCDATA)>
<!ELEMENT nama_belakang (#PCDATA)>
<!ELEMENT profesi
(#PCDATA)>
]>
<orang>
<nama>
<nama_depan>Hendra
Kusmayadi</nama_depan>
</nama>
<profesi>Dosen</profesi>
<profesi>Pedagang</profesi>
</orang>
Maka jika kita jalankan hasilnya adalah :
Kita juga dapat membuat file DTD pada file yang terpisah dengan dokumen
XML aslinya.
Caranya denga penulisan
DTDnya menjadi :
<!DOCTYPE nama_dokumen
SYSTEM "lokasi_file_DTD">
Sekarang kita ubah lagi
file
contoh3_1.xml diatas menjadi
:
<?xml version=”1.0” encoding=”UTF-8”
standalone=”no” ?>
<!DOCTYPE orang SYSTEM
“orang.dtd”>
<orang>
<nama>
<nama_depan>Hendra
Kusmayadi</nama_depan>
</nama>
<profesi>Dosen</profesi>
<profesi>Pedagang</profesi>
</orang>
Dan membuat dokumen baru dengan nama orang.dtd yang isinya sebagai berikut :
<!ELEMENT orang (nama, profesi*)>
<!ELEMENT nama (nama_depan | nama_belakang)>
<!ELEMENT nama_depan (#PCDATA)>
<!ELEMENT
nama_belakang (#PCDATA)>
<!ELEMENT profesi (#PCDATA)>
Jika kita jalankan dan kita validasi file contoh3_1.xml akan tampak seperti
berikut :
Jika kita lihat pada dokumen diatas, ada beberapa bagian darideklarasi elemen adalah :
6. #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)>
7. 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.
8. 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)>
9. Jumlah anak
Penulisan jumlah anak daru suatu elemen dapat kita
tuliskan dengan cara menambahkan
tanda berikut pada akhir nama elemen.
Contoh penggunaannya
adalah sebagai berikut :
<!ELEMENT people
(phone_number*)>
artinya elemen
people boleh memiliki
satu
atau lebih elemen
phone_number
atau bisa juga kosong.
10. 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.
Selain hal
diatas,
kita
juga dapat mendeklarasikan
elemen yang sesuai dengan
:
11. 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)*>
12. 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>
13.
ANY
Kita dapat
mengijinkan apapun dapat
berada pada suatu elemen.
Penulisan deklarasinya adalah :
<!ELEMENT page ANY>
Deklarasi Atribut
Sama seprti elemen, dokumen dikatakan valid jika
dapat menyatakan semua atribut elemen jika elemennya memiliki atribut.
Sintaks penulisannya adalah
dengan
ATTLIST.
Sebagai contoh, mari kita buat sebuah file baru dengan nama contoh3_2.xml. Dan isinya adalah sebagai berikut :
<?xml
version=”1.0” encoding=”UTF-8”
standalone=”yes” ?>
<!DOCTYPE
orang [
<!ELEMENT orang (nama, profesi*)>
<!ELEMENT nama (#PCDATA)>
<!ATTLIST nama profesi CDATA #REQUIRED
hobi CDATA “Olahraga”
umur CDATA #IMPLIED
jenis_kelamain CDATA #FIXED “Laki-laki”
>
]>
<orang>
<nama
profesi=”Dosen”>Hendra Kusmayadi</nama>
</orang>
Jika kita jalankan dokumen diatas akan
tampak seperti
gambar berikut :
General Entity Declarations
Kita
juga dapat mendeklarasikan entidas sesuai dengan yang
kita inginkan. Sebagai contoh, buatlah file dengan nama contoh3_3.xml dengan isi sebagai
berikut :
<!DOCTYPE orang
[
<!ELEMENT orang (nama,
email)>
<!ELEMENT nama
(#PCDATA)>
<!ELEMENT email (#PCDATA)>
]>
<orang>
<nama>Hendra
Kusmayadi</nama>
<email>&mail;</email>
</orang>
Jika kita jalankan
maka tampilannya
akan seperti gambar dibawah
:
External Parsed General Entities
Selain dengan cara diatas, kita juga dapat menggunakan halaman suatu web atau yang lainnya untuk penulsain entitas. Sebagai
contoh,
buatlah dile dengan
nama contoh3_4.xml
dengan
isinya sebagai berikut :
<!DOCTYPE
orang [
<!ELEMENT orang (nama, komentar)>
<!ELEMENT nama
(#PCDATA)>
<!ELEMENT komentar
(#PCDATA)>
<!ENTITY cmd SYSTEM
"komentar.txt">
]>
<orang>
<nama>Hendra Kusmayadi</nama>
<komentar>&cmd;</komentar>
</orang>
sebelum kita
menjalankan dokumen diatas, terlebihdahulu kita membuat
sebuah file dengan nama komentar.txt dan simpan pada folder yang
sama. Selanjutnya isi file tersebut
tulisan terserah saja. Dan jika dokumen diatas dijalankan, maka hasilnya menjadi :
External Unparsed Entities and Notations
Selain itu,
kita
juga dapat menempatkan
file bukan text dengan
cara :
<!ENTITY
nama_entitas SYSTEM "Lokasi_file"
NDATA tipe_file>
Dan selanjutnya silahkan docoba sendiri.
Parameter
Entity
Parameter entiti digunakan sebagi shortcut untuk
menuliskan entiti
didalan DTD. Penulisan parameter entiti menggunakan persen (%) dan titik koma
(;). format penulisan
parameter entiti
adalah
sebagai
berikut :
<!ENTITY % nama_parameter "teks yang ingin kita representasikan didalam
entiti">
Contoh
penulisannya adalah dengan :
<!ENTITY % pub
"Editions Gallimard" >
<!ENTITY
rights "All rights reserved" >
<!ENTITY book "La Peste:
Albert Camus, © 1947
%pub;. &rights;">
Adapun maksud dari deklarasi diatas adalah string “%pub” akan diisi oleh
“Éditions Gallimard”, sehingga jika kita menuliskan
&book
pada dokumen XML, maka hasilnya adalah
:
La Peste: Albert
Camus, © 1947 Editions Gallimard.
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)>
]]>
Tujuan penulisan diatas adalah
untuk menunjukan
bahwa deklarasi
yang diberikan
benar-benar digunakan didalam DTD. Contoh
:
<![INCLUDE[
<!ELEMENT production_note (#PCDATA)>
]]>
Silahkan docoba dengan penerapan pada dokumen XML.
Contoh Two DTD
Disisilain kita dapat membuat atau menggabungkan dua dokumen XML yang berbeda.
Caranya adalah seperti
contoh
penulisan DTD berikut :
<!ATTLIST biography xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
<!ELEMENT person
(first_name, last_name)>
<!ATTLIST person born CDATA #IMPLIED
died
CDATA #IMPLIED>
<!ELEMENT date (month, day,
year)>
<!ELEMENT month (#PCDATA)>
<!ELEMENT day (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ATTLIST emphasize
xlink:type (simple) #IMPLIED
xlink:href CDATA #IMPLIED>
<!ELEMENT profession
(#PCDATA)>
<!ELEMENT footnote (#PCDATA)>
<!ATTLIST footnote source
CDATA #REQUIRED>
<!ELEMENT first_name
(#PCDATA)>
<!ELEMENT last_name (#PCDATA)>
<!ELEMENT image EMPTY>
<!ATTLIST image source CDATA #REQUIRED
width NMTOKEN #REQUIRED height NMTOKEN #REQUIRED
ALT CDATA #IMPLIED >
<!ENTITY % top_level "(
#PCDATA | image | paragraph
| definition | person | profession | emphasize
|
last_name | first_name |
footnote | date )*">
<!ELEMENT paragraph %top_level;
>
<!ELEMENT definition
%top_level; >
<!ELEMENT emphasize %top_level; >
<!ELEMENT biography %top_level; >
Standar Penempatan 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.