Selamat Datang di Blog Ir.Fanz

Document Type Definitions (DTD) dan Validation pada XML


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 &lt; 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