Sebuah Instansi XSD

Bagian ini akan menunjukkan bagaimana menulis Schema XML. Anda juga akan belajar berbagai metode menulis schema.

Dokumen XML

Mari lihat dokumen XML yang dinamai "shiporder.xml":

<?xml version="1.0" encoding="ISO-8859-1"?>
<shiporder orderid="889923">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
 <orderperson>George Bush</orderperson>
 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</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 termasuk elemen utama "shiporder", yang berisi atribut yang harus dinamai "orderid". Elemen "shiporder" mengandung tiga elemen anak yang berbeda: "orderperson", "shipto" dan "item". Elemen "item" muncul dua kali, yang mengandung atribut "title", elemen pilihan "note", "quantity" dan elemen "price".

Baris ini xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" memberitahu pemroses XML untuk memverifikasi dokumen ini berdasarkan schema tertentu. Baris ini: xsi:noNamespaceSchemaLocation="shiporder.xsd" menentukan lokasi schema (di sini, ia berada di folder yang sama dengan "shiporder.xml").

Buat sebuah XML Schema

Sekarang, kami perlu membuat schema untuk dokumen XML di atas.

Kami dapat memulai dengan membuka sebuah berkas baru dan memberikan namanya "shiporder.xsd". Untuk membuat schema, kami hanya perlu mengikuti struktur dokumen XML, menentukan setiap elemen yang ditemukan. Pertama, kami mulai dengan menentukan deklarasi XML standar:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...
</xs:schema>

Dalam schema di atas, kami menggunakan namespace standar (xs), namespace ini berhubungan dengan definisi bahasa Schema (Schema language definition), nilai standar adalah http://www.w3.org/2001/XMLSchema.

Selanjutnya, kami perlu menentukan elemen "shiporder" ini. Elemen ini memiliki atribut yang mengandung elemen lain, jadi kami menganggapnya sebagai tipe gabungan. Anak elemen elemen "shiporder" diselilingi oleh elemen xs:sequence, yang menentukan urutan anak elemen:

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
  ...
  ...
  </xs:sequence>
  ...
 </xs:complexType>
</xs:element>

Lalu kami perlu menentukan elemen "orderperson" sebagai tipe sederhana (ini karena elemen ini tidak mengandung atribut atau elemen lain). Prefiks tipe (xs:string) ditentukan oleh prefiks namespace, namespace ini berhubungan dengan XML schema yang menunjukkan tipe data schema yang prdefinisi:

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

Selanjutnya, saya perlu menentukan tipe gabungan untuk dua elemen: "shipto" dan "item". Mulai dengan menentukan 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 schema, kami dapat menggunakan atribut maxOccurs dan minOccurs untuk menentukan jumlah kemungkinan penampilan suatu elemen. maxOccurs menentukan nilai maksimum penampilan suatu elemen, sementara minOccurs menentukan nilai minimum penampilan suatu elemen. Nilai default maxOccurs dan minOccurs adalah 1!

Sekarang, kami dapat menentukan elemen "item" ini. Elemen ini dapat muncul beberapa kali di dalam elemen "shiporder". Hal ini dicapai dengan mengatur nilai atribut maxOccurs elemen "item" menjadi "unbounded", sehingga elemen "item" dapat muncul sebanyak yang diinginkan pencipta. Perhatikan, elemen "note" adalah elemen pilihan. Kami telah mengatur nilai atribut minOccurs elemen ini menjadi 0:

<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, kami dapat menyatakan atribut elemen "shiporder" ini. Sebagai atribut wajib, kami menetapkan use="required".

Keterangan:Pengumuman atribut ini harus ditempatkan di akhir:

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

Ini adalah daftar dokumen file schema yang bernama "shiporder.xsd":

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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>

Pemecahan Schema

Metode desain sebelumnya sangat mudah, tetapi sulit untuk dibaca dan dipeeling saat dokumen sangat kompleks.

Metode desain yang akan disebutkan berdasarkan definisi semua elemen dan atribut pertama, lalu menggunakan atribut ref untuk mengacu padanya.

Ini adalah file schema yang dirancang dengan metode baru:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 简易元素的定义 -->
<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"/>
<!-- Definisi atribut -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- Definisi elemen kompleks -->
<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>

Gunakan tipe yang ditentukan (Tipe BerNama)

Metode desain ketiga menentukan kelas atau tipe, sehingga kita dapat mengulang penggunaan definisi elemen. Cara khususnya adalah: pertama, beri nama elemen sederhana dan kompleks, kemudian arahkan ke mereka melalui atribut type elemen.

Ini adalah file schema yang dirancang menggunakan metode ketiga ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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 restriction menunjukkan tipe data berasal dari ruang nama tipe data W3C XML Schema. Oleh karena itu, bagian di bawah ini juga berarti nilai elemen atau atribut harus berupa nilai tipe string:

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

Elemen pembatas sering digunakan untuk menekan batasan terhadap elemen. Lihat contoh berikut ini dari schema di atas:

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

Kode ini menunjukkan bahwa nilai elemen atau atribut harus berupa string, dan harus berupa enam karakter berurutan, dan karakter ini harus berupa angka 0-9.