Contoh XSD
Bab ini akan mendemonstrasikan cara menulis Skema XML. Anda juga akan belajar bahwa skema dapat ditulis dengan cara yang berbeda.
Dokumen XML
Mari kita lihat dokumen XML ini yang disebut "shiporder.xml":
<?xml version="1.0" encoding="UTF-8"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
<orderperson>John Smith</orderperson>
<shipto>
<name>Ola Nordmann</name>
<address>Langgt 23</address>
<city>4000 Stavanger</city>
<country>Norway</country>
</shipto>
<item>
<title>Empire Burlesque</title>
<note>Special Edition</note>
<quantity>1</quantity>
<price>10.90</price>
</item>
<item>
<title>Hide your heart</title>
<quantity>1</quantity>
<price>9.90</price>
</item>
</shiporder>
Dokumen XML di atas terdiri dari elemen root, "shiporder", yang berisi atribut wajib yang disebut "orderid". Elemen "shiporder" berisi tiga elemen anak yang berbeda: "orderperson", "shipto" dan "item". Elemen "item" muncul dua kali, dan berisi "title", elemen "catatan" opsional, "kuantitas", dan elemen "harga".
Baris di atas: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" memberi tahu parser XML bahwa dokumen ini harus divalidasi terhadap skema. Baris: xsi:noNamespaceSchemaLocation="shiporder.xsd" menentukan DI MANA skema berada (ini dia di folder yang sama dengan "shiporder.xml").
Buat Skema XML
Sekarang kita ingin membuat skema untuk dokumen XML di atas.
Kita mulai dengan membuka file baru yang akan kita sebut "shiporder.xsd". Untuk membuat skema, kita cukup mengikuti struktur dalam dokumen XML dan mendefinisikan setiap elemen saat kita menemukannya. Kita akan mulai dengan deklarasi XML standar diikuti oleh elemen xs:schema yang mendefinisikan skema:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>
Dalam skema di atas kami menggunakan namespace standar (xs), dan URI yang terkait dengan namespace ini adalah definisi bahasa Skema, yang memiliki nilai standar http://www.w3.org/2001/XMLSchema.
Selanjutnya, kita harus mendefinisikan elemen "shiporder". Elemen ini memiliki atribut dan mengandung elemen lain, oleh karena itu kami menganggapnya sebagai tipe yang kompleks. Elemen turunan dari elemen "pengiriman" dikelilingi oleh elemen xs:sequence yang mendefinisikan urutan subelemen yang berurutan:
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
...
</xs:sequence>
</xs:complexType>
</xs:element>
Kemudian kita harus mendefinisikan elemen "orderperson" sebagai tipe sederhana (karena tidak mengandung atribut atau elemen lainnya). Jenis (xs:string) diawali dengan awalan namespace yang terkait dengan Skema XML yang menunjukkan tipe data skema yang telah ditentukan sebelumnya:
<xs:element name="orderperson" type="xs:string"/>
Selanjutnya, kita harus mendefinisikan dua elemen yang bertipe kompleks: "shipto" dan "item". Kita mulai dengan mendefinisikan elemen "shipto":
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Dengan skema, kita dapat menentukan jumlah kemungkinan kemunculan untuk elemen dengan atribut maxOccurs dan minOccurs. maxOccurs menentukan jumlah maksimum kemunculan elemen dan minOccurs menentukan jumlah minimum kemunculan elemen. Nilai default untuk maxOccurs dan minOccurs adalah 1!
Sekarang kita dapat mendefinisikan elemen "item". Elemen ini dapat muncul beberapa kali di dalam elemen "pengiriman". Ini ditentukan dengan menyetel atribut maxOccurs dari elemen "item" ke "unbounded" yang berarti bahwa elemen "item" dapat muncul sebanyak mungkin sesuai keinginan penulis. Perhatikan bahwa elemen "catatan" adalah opsional. Kami telah menetapkan ini dengan menyetel atribut minOccurs ke nol:
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Sekarang kita dapat mendeklarasikan atribut dari elemen "shiporder". Karena ini adalah atribut yang diperlukan, kami menentukan use="required".
Catatan: Deklarasi atribut harus selalu terakhir:
<xs:attribute name="orderid" type="xs:string" use="required"/>
Berikut adalah daftar lengkap file skema yang disebut "shiporder.xsd":
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Bagi Skema
Metode desain sebelumnya sangat sederhana, tetapi bisa sulit untuk dibaca dan dipelihara jika dokumennya rumit.
Metode desain berikutnya didasarkan pada pendefinisian semua elemen dan atribut terlebih dahulu, dan kemudian merujuknya menggunakan atribut ref.
Berikut adalah desain baru dari file skema ("shiporder.xsd"):
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- definition of complex elements -->
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="address"/>
<xs:element ref="city"/>
<xs:element ref="country"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item">
<xs:complexType>
<xs:sequence>
<xs:element ref="title"/>
<xs:element ref="note" minOccurs="0"/>
<xs:element ref="quantity"/>
<xs:element ref="price"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element ref="orderperson"/>
<xs:element ref="shipto"/>
<xs:element ref="item" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute ref="orderid" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Menggunakan Jenis Bernama
Metode desain ketiga mendefinisikan kelas atau tipe, yang memungkinkan kita untuk menggunakan kembali definisi elemen. Ini dilakukan dengan menamai elemen simpleTypes dan complexTypes, lalu menunjuk ke elemen tersebut melalui atribut type dari elemen tersebut.
Berikut adalah desain ketiga dari file skema ("shiporder.xsd"):
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
<xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
<xs:restriction base="xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="shiptotype">
<xs:sequence>
<xs:element name="name" type="stringtype"/>
<xs:element name="address" type="stringtype"/>
<xs:element name="city" type="stringtype"/>
<xs:element name="country" type="stringtype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="itemtype">
<xs:sequence>
<xs:element name="title" type="stringtype"/>
<xs:element name="note" type="stringtype" minOccurs="0"/>
<xs:element name="quantity" type="inttype"/>
<xs:element name="price" type="dectype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="shipordertype">
<xs:sequence>
<xs:element name="orderperson" type="stringtype"/>
<xs:element name="shipto" type="shiptotype"/>
<xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
</xs:sequence>
<xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
</xs:schema>
Elemen pembatasan menunjukkan bahwa tipe data berasal dari tipe data namespace Skema XML W3C. Jadi, fragmen berikut berarti nilai elemen atau atribut harus berupa nilai string:
<xs:restriction base="xs:string">
Elemen restriksi lebih sering digunakan untuk menerapkan batasan pada elemen. Perhatikan baris berikut dari skema di atas:
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
Ini menunjukkan bahwa nilai elemen atau atribut harus berupa string, harus tepat enam karakter berturut-turut, dan karakter tersebut harus berupa angka dari 0 hingga 9.