Friday, 25 September 2015

Document Type Definitions (DTD)

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  diatadijalankan,  dan  kitmemvalidasinya,  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  yanisinya 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)>
<!ENTITY mail "admin@somethingweb.com">
]>
<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, &#xA9; 1947
%pub;. &rights;">

Adapun maksud dari deklarasi diatas adalah string %pub” akan diisi oleh &#xc9;ditions Gallimard,  sehingga  jika  kitmenuliskan  &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.

No comments:

Post a Comment