Home » XML » XSD : Contoh Dokumen XSD Komplex

XSD : Contoh Dokumen XSD Komplex

by Hanifah Nurbaeti
by Hanifah Nurbaeti

Section Artikel

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>Jimmy</orderperson>
  <shipto>
    <name>Olaf</name>
    <address>CLD 34</address>
    <city>Tangerang</city>
    <country>Indonesia</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 “judul”, 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 dengan skema. Baris: xsi: noNamespaceSchemaLocation = "shiporder.xsd" menentukan DI MANA skema berada (ini di folder yang sama dengan “shiporder.xml”).

Buat Skema XML

Sekarang kit akan membuat skema untuk dokumen XML di atas.

Kita mulai dengan membuka file baru yang akan kami 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 dengan 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 kita 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 “shiporder” dikelilingi oleh elemen xs: sequence yang menentukan urutan sub elemen:

<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 lain). Tipe (xs: string) diawali dengan prefiks namespace yang terkait dengan XML Schema yang menunjukkan tipe data skema yang telah ditentukan:

<xs:element name="orderperson" type="xs:string"/>

Selanjutnya, kita harus mendefinisikan dua elemen dari tipe 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 kejadian yang mungkin untuk elemen dengan atribut maxOccurs dan minOccurs. maxOccurs menentukan jumlah kemunculan maksimum untuk sebuah elemen dan minOccurs menentukan jumlah minimum kemunculan untuk sebuah elemen. Nilai default untuk maxOccurs dan minOccurs adalah 1!

Sekarang kita bisa mendefinisikan elemen “item”. Elemen ini dapat muncul beberapa kali di dalam elemen “shiporder”. Hal ini ditentukan dengan menyetel atribut maxOccurs dari elemen “item” ke “unbounded” yang berarti bahwa ada kemunculan elemen “item” sebanyak yang diinginkan pembuatnya. Perhatikan elemen “note” adalah opsional. Kita telah menentukan 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 wajib, kita tentukan use = "required".

Catatan: Deklarasi atribut harus selalu terakhir:

<xs:attribute name="orderid" type="xs:string" use="required"/>

Berikut adalah daftar lengkap dari 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>

Bagilah Skema(Divide)

Metode desain sebelumnya sangat sederhana, tetapi mungkin sulit untuk dibaca dan dipelihara jika dokumennya rumit.

Metode desain selanjutnya didasarkan pada pendefinisian semua elemen dan atribut terlebih dahulu, dan kemudian mengacu padanya 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 memberi nama elemen simpleTypes dan complexTypes, lalu mengarahkannya 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 W3C XML Schema. Jadi, fragmen berikut berarti nilai elemen atau atribut harus berupa nilai string:

<xs:restriction base="xs:string">

Elemen batasan (restriction) lebih sering digunakan untuk menerapkan batasan pada elemen. Lihat 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>

Hal ini menunjukkan bahwa nilai elemen atau atribut harus berupa string, harus tepat terdiri dari enam karakter berturut-turut, dan karakter tersebut harus berupa angka dari 0 hingga 9.

You may also like