一个 XSD 实例

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

Dokumen XML

Biarkan kami 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 root "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, ia memiliki "title", elemen pilihan "note", "quantity" dan elemen "price".

Baris ini xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance", memberitahu parser 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, kita perlu membuat schema untuk dokumen XML di atas.

Kami dapat memulai dengan membuka sebuah berkas baru dan menamainya "shiporder.xsd". Untuk membuat schema, kami hanya perlu mengikuti struktur dokumen XML, mendefinisikan setiap elemen yang kami temukan. Pertama, kita mulai dengan mendefinisikan 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, kita menggunakan ruang nama standar (xs), ruang nama ini berhubungan dengan definisi bahasa Schema (Schema language definition), nilai standarnya adalah http://www.w3.org/2001/XMLSchema.

Selanjutnya, kita perlu mendefinisikan elemen "shiporder" ini. Elemen ini memiliki atribut yang mengandung elemen lain, jadi kita mengidentifikasikannya sebagai tipe gabungan. Anak elemen elemen "shiporder" dikepalkan oleh elemen xs:sequence, yang mendefinisikan urutan anak elemen:

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

Lalu kita perlu mendefinisikan elemen "orderperson" sebagai tipe sederhana (ini karena ia tidak mengandung atribut atau elemen lain). Prefiks tipe (xs:string) ditentukan oleh prefix ruang nama, ruang nama ini berhubungan dengan XML schema yang menunjukkan tipe data schema yang pradefinisi:

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

Selanjutnya, saya perlu mendefinisikan tipe gabungan untuk dua elemen: "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 schema, kami dapat menggunakan atribut maxOccurs dan minOccurs untuk mendefinisikan jumlah kemungkinan penampilan suatu elemen. maxOccurs mendefinisikan nilai maksimal penampilan suatu elemen, sementara minOccurs mendefinisikan nilai minimal penampilan suatu elemen. Nilai default maxOccurs dan minOccurs adalah 1!

Sekarang, kami dapat mendefinisikan 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 penulis. Perhatikan, elemen "note" adalah elemen opsional. Kita 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:Pernyataan 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 dipeguam saat dokumen sangat kompleks.

Metode desain yang akan dijelaskan berdasarkan definisi semua elemen dan atribut terlebih dahulu, kemudian menggunakan atribut ref untuk merujuk ke mereka.

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">
<!-- Definisi elemen sederhana -->
<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 gabungan -->
<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 mendefinisikan kelas atau tipe, sehingga kita dapat mengulang penggunaan definisi elemen. Cara kerjanya 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>

elemenbatasan menunjukkan bahwa tipe data berasal dari tipe data namespace W3C XML Schema. Oleh karena itu, fragmen di bawah ini juga berarti nilai elemen atau atribut harus berupa nilai tipe teks:

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

elemenbatasan biasanya digunakan untuk menekan elemen. Lihat fragmen berikut ini yang berasal dari schema di atas:

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

这段代码指示出,元素或属性的值必须是字符串,并且必须是连续的六个字符,同时这些字符必须是 0-9 的数字。