Forum | tutorial pengembangan web terbaru
 

Sebuah Contoh XSD


Bab ini akan menunjukkan bagaimana menulis sebuah Skema XML. Anda juga akan belajar bahwa skema dapat ditulis dengan cara yang berbeda.


Dokumen XML

Mari kita lihat dokumen XML ini 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 yang diperlukan disebut "orderid" . The "shiporder" elemen mengandung tiga unsur anak yang berbeda: "orderperson" , "shipto" dan "item" . The "item" elemen muncul dua kali, dan itu berisi "title" , opsional "note" elemen, sebuah "quantity" , dan "price" elemen.

baris di atas: xmlns: XSI = "http://www.w3.org/2001/XMLSchema-instance" menceritakan parser XML bahwa dokumen ini harus divalidasi terhadap skema. Garis: XSI: noNamespaceSchemaLocation = "shiporder.xsd" menentukan MANA skema Resides (here it is in the same folder as "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 hanya bisa mengikuti struktur dalam dokumen XML dan mendefinisikan setiap elemen seperti yang kita temukan. Kami akan mulai dengan deklarasi XML standar diikuti oleh xs: element skema 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 standar namespace (xs) , dan URI terkait dengan namespace ini adalah definisi bahasa Skema, yang memiliki nilai standar http://www.w3.org/2001/XMLSchema.

Selanjutnya, kita harus mendefinisikan "shiporder" elemen. Elemen ini memiliki atribut dan mengandung unsur-unsur lain, oleh karena itu kita menganggapnya sebagai tipe kompleks. Elemen anak dari "shiporder" elemen dikelilingi oleh xs: element urutan yang mendefinisikan memerintahkan urutan sub unsur:

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

Maka kita harus mendefinisikan "orderperson" elemen sebagai tipe sederhana (karena tidak mengandung atribut atau elemen lainnya). Jenis (xs:string) diawali dengan awalan namespace yang terkait dengan skema XML yang menunjukkan jenis skema data yang telah ditetapkan:

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

Selanjutnya, kita harus mendefinisikan dua elemen yang dari jenis kompleks: "shipto" dan "item" . Kita mulai dengan mendefinisikan "shipto" elemen:

<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 kejadian untuk unsur dengan maxOccurs dan atribut minOccurs. maxOccurs menentukan jumlah maksimum kejadian untuk elemen dan minOccurs menentukan jumlah minimum kejadian untuk elemen. Nilai default untuk kedua maxOccurs dan minOccurs adalah 1!

Sekarang kita dapat mendefinisikan "item" elemen. Elemen ini dapat muncul beberapa kali di dalam "shiporder" elemen. Ini ditentukan dengan menetapkan maxOccurs atribut dari "item" elemen "unbounded" yang berarti bahwa ada dapat banyak kejadian dari "item" elemen sebagai keinginan penulis. Perhatikan bahwa "note" elemen opsional. Kami telah ditentukan ini dengan menetapkan minOccurs atribut 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>

Kita sekarang dapat mendeklarasikan atribut dari "shiporder" elemen. Karena ini adalah atribut yang dibutuhkan kita tentukan penggunaan = "diperlukan".

Note: The deklarasi atribut harus selalu datang 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

Metode desain sebelumnya sangat sederhana, tetapi bisa sulit untuk membaca dan mempertahankan ketika dokumen yang kompleks.

Metode desain berikutnya berdasarkan mendefinisikan semua elemen dan atribut pertama, dan kemudian merujuk kepada mereka menggunakan ref atribut.

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 Dinamakan

Metode desain ketiga mendefinisikan kelas atau jenis, yang memungkinkan kita untuk menggunakan kembali definisi elemen. Hal ini dilakukan dengan penamaan simpleTypes dan complexTypes elemen, dan kemudian arahkan ke mereka melalui type atribut dari elemen.

Berikut adalah desain ketiga 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>

Unsur pembatasan menunjukkan bahwa datatype ini berasal dari namespace datatype W3C XML Schema. Jadi, fragmen berikut berarti bahwa nilai dari elemen atau atribut harus menjadi nilai string:

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

Unsur pembatasan lebih sering digunakan untuk menerapkan pembatasan untuk elemen. Lihatlah 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 dari elemen atau atribut harus string, itu harus tepat enam karakter berturut-turut, dan karakter-karakter harus berupa angka dari 0 sampai 9.