Wednesday 30 September 2015

XML Schemas

Meskipun Document Type Definitions (DTD) dapat menerapkan aturan- dasar  struktural  pada  dokumen,  banyak  aplikasi  yang  membutuhkan
metode validasi. Sehingga W3C membuat XML Schema Recommendation,

yang dirilis pada 2 Mei 2001 untuk menjawab pertanyaan diatas. Skema dapat menjelaskan complex restrictions pada elemen dan atribut. Beberapa skema dapat dikombinasikan menjadi dokumen yang menggunakan beberapa kosakata XML. Dengan demikinan, skema dapat lebih powerful menggambarkan struktur dokumen XML. XML Schema merupakan informasi mengenai metadata yang mendefinisikan cara yang tepat penstrukturan file XML.

Overview
Sebuah  dokumen  XML  yang  dideskripsikan  oleh  skemdisebut  dengan instance document. Jika dokumen memenuhi semua konstrain yang dispesifikasikan oleh skema, maka dianggap sebagai schema-valid.

Schemas Versus DTDs
DTDs memberikan kemampuan dasar untuk melakukan validasi item berikut dalam dokumen XML:
55.   Element nesting
56.   Element occurrence constraints
57.   Permitted attributes
58.   Attribute types and default values

Sedangkan skema standar memasukan :
59.   Simple and complex data types
60.   Type derivation and inheritance
61.   Element occurrence constraints
62.   Namespace-aware element and attribute declarations

Namespace Issues
DTDs tidak memberikan dukungan  bagi eksplisit menyatakan namespace- aware aplikasi XML. Skema tidak seperti DTD yang menambahkan prefik pada elemen, skema memvalidasi kombinasi dari namespace URI dan lokal name yang mempunyai prefiks.

Skema Dasar
Misalnya kita mempunyai dokumen XML :

<?xml version="1.0" ?>
<note>
<to>Ridho</to>
<from>Someone</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>



Kita dapat menuliskan schema-nya seperti berikut :

<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNameSpace="http://www.w3school.com" xmlns="http://www.w3school.com" elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element                   name="heading" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

File XML Schema biasanya disimpan dengan ektensi *.xsd. Untuk mempraktekannya, biatlah file XSD diatas dan simpan dengan nama XMLSchema.xsd. Selanjutnya buat dokumen XML diatas dengan nama file contoh10_1.xml, mamun  tambahkaatribut  damanespace  pada elemen root, Sehingga kodenya menjadi seperti berikut :

<?xml version="1.0">

xsi:noNamespaceSchemaLocation="XMLSchema.xsd">
<to>Ridho</to>
<from>Someone</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

jika  kita  menjalankan  dokumen  diatas  dan  memvalidasinya,  maka  tampak bahwa dokumen tersebut valid. Seperti dapat dilihat pada gambar dibawah ini

XML Scema juaga memiliki atribut xs:annotation yang digunakan untuk menjamin bahwa komentar akan tetap utuh hingga proses parsing selesai. Annotation memiliki konbinasi:
7. Elemen xs:documentation
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:documentation xml:lang="en-us"> Simple schema example from O'Reilly's
<a
in a Nutshell.</a>
Copyright 2002 O'Reilly &amp; Associates
</xs:documentation>
</xs:annotation>
<xs:element name="fullName" type="xs:string"/>
</xs:schema>



8. Elemen xs:appinfo
berisi  kombinasi  karakter  data  atau  markup  dari  skema  yang  akan
diincludekan

Dari  contodiatas,  kita dapat  melihat  elemen berikut  :  <xs:element name="from" type="xs:string"/>. Elemen tersebut berfungsi sebagai pendeklarasian dari elemen. Pada contoh diatas kita akam mengisi elemen  from  dengan  data yang  tipenya  string.  Jika  kita  ingin  menuliskan elemen lain dalam siatu elemen, maka kita definisikan pada contoh diatas adalah :

<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

Maksudnya contoh diatas adalah elemen note dapat berisi elemen lain seperti to, from dan heading.

untuk mendeklarasikan atribut, kita dapat menggunakanelemen xs:attribute sehingga  penulisannya  menjadi  <xs:attribute name="language" type="xs:language"/>.  Misalnya  pada dokumen XML diatas kita tambahkan sebuah atribut sehingga sintaksnya menjadi :

<note>
<to age='34'>Ridho</to>
<from age='34'>Someone</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

maka penulisan XML Schemanya adalah :

<xs:element name="note">



<xs:complexType>
<xs:sequence>
<xs:element name="to">
<xs:complexType>
<xs:attribute name="umur" type="xs:language"/>
</xs:complexType>
</xs:element>
<xs:element name="from">
<xs:complexType>
<xs:attribute name="umur"
type="xs:language"/>
</xs:complexType>
</xs:element>
<xs:element name="heading" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

Jika kita jalankan dokumen diatas, mak akan tampak seperti berikut :


Tipe  baru  dapat  didefinisikan  dengan  elemen  xs:complexType atau xs:simpleType. Jika tipe tersebut dideklarasikan secara global, perlu diberikan nama agar dari atribut atau elemen dalam skema. jika tipenya dedefinisikan secara inline, maka tidak perlu diberi nama dan tidak dapat diarahkan oleh atribut dan elemen didalan skema karena tidak memiliki nama.

Bekerja dengan Namespace
Untuk penulisan namespace pada schema kita dapat menuliskan langsung pada elemen yang akan kita beri namespace. Misalnya kita ingin menamai sebuah elemen, maka kita dapat menuliskannya dengan :

<?xml version="1.0"?>
<Book xmlns:lib="http://www.library.com">
<lib:Title>Sherlock Holmes</lib:Title>
<lib:Author>Arthur Conan Doyle</lib:Author>
</Book>

Elemen Kosong
Penulisan  elemen  kosong  adalah  dengan  cara  tidak  mengisikan  elemen kedalam deklarasi. Misalnya pada contoh berikut kita katakan bahwa elemen heading adalah kosong, maka format penulisan untuk XML Schema adalah seperti berikut :

<?xml version="1.0" ?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNameSpace="http://www.w3school.com" xmlns="http://www.w3school.com" elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>



atau apabila elemen heading memiliki atribut, maka penulisannya menjadi :

<xs:element name="heading">
<xs:complexType>
<xs:attribute name="number" type="xs:string"/>
</xs:complexType>
</xs:element>

Elemen  xs:simpleContent digunakan  untuk  mendeklarasikan  elemen sederhana.

<xs:element name="heading">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="number" type="xs:language"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>

Tipe kompleks
jika kita ingin mendefinisikan semua elemen apapun, maka kita dapat menuliskan elemen xs:any dimana elemen ini membolehkan atribut yang menunjukan tingkat validasi yang harus diberikan pada konten jika ada. Contohnya :

<xs:element name="notes" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:any namespace="http://www.w3.org/1999/xhtml"
minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
</xs:sequence>
</xs:complexType>
</xs:element>



Mixed Content
Untuk menggabungkan dokumen XML dengan schema (xsd), kita dapat menggunakan kode sebagai berikut :

<letter xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance" "xsi:noNamespaceSchemaLocation="formletter.xsd">
<greeting><hello/> Bob!</greeting>
<body>
Thank you for ordering the <item/> ($<price/>), it should arrive
by <arrivalDate/>.
</body>
<closing/>
</letter>


Controlling Type Derivation
Atribut final dapat ditambahkan pada sebuah definisi tipe kompleks untuk mengatur #all, extension, atau restriction. Apabila suatu tipe berasal dari tipe lain yang memiliki atribut final, schema processor memverifikasi. Contoh penulisan :

<xs:complexType name="physicalAddressType" final="extension">

kita dapat men-setnya secara permanen dengan nilai yang diberikan dengan cara menambahkan atribut fixed="true".

Untuk membuat suatu elemen menjadi unik, maka ktia dapat menggunakan elemen xs:unique dan xs:key. Elemen   xs:unique akan memaksa nilai elemen dan atribut menjaid unik untuk spesifikasi elemen dalam skema dokumen. Contoh :

<xs:element name="contacts" type="addr:contactsType" minOccurs="0">
<xs:unique name="phoneNums">
<xs:selector xpath="phone"/>
<xs:field xpath="@addr:number"/>



</xs:unique>
</xs:element>

Sedangkan elemen xs:key hampir sam xs:unique namun, xs:key menggunakan elemen xs:selector untuk mendefinisikan satu set elemen. Contoh penggunaanya adalah :

<xs:element name="address">
<xs:complexType>
<xs:sequence>
<xs:element name="fullName">

. . .















. . .

</xs:element>
<xs:element name="kids" minOccurs="0">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="kid">
<xs:complexType>
<xs:attribute name="ssn"
type="addr:ssn"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:sequence>
<xs:attributeGroup ref="addr:nationality"/>
<xs:attribute name="ssn" type="addr:ssn"/>
<xs:anyAttribute
</xs:complexType>
</xs:element>