一个 XSD 实例
Bagian ini akan memperkenalkan bagaimana menulis Schema XML. Anda juga akan belajar berbagai metode menulis schema.
Dokumen XML
Beri tahu kami tentang 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 mengandung atribut yang harus dinamai "orderid". Elemen "shiporder" mengandung tiga elemen anak yang berbeda: "orderperson", "shipto" dan "item". Elemen "item" muncul dua kali, ia mengandung elemen "title", elemen pilihan "note", "quantity" dan elemen "price".
Baris ini xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance", memberitahu pemecah XML untuk memeriksa dokumen ini berdasarkan schema tertentu. Baris ini: xsi:noNamespaceSchemaLocation="shiporder.xsd" menentukan lokasi schema (di sini, ia berada di dalam folder yang sama dengan "shiporder.xml").
Buat satu XML Schema
Sekarang, kami perlu membuat schema untuk dokumen XML di atas.
Kami boleh memulai dengan membuka sebuah file baru dan menamakannya "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, 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.
Kemudian, kita perlu menentukan elemen "shiporder" sebagai jenis kumpulan. Elemen ini memiliki atribut yang mengandung elemen lain, jadi kita mengidentifikasikannya sebagai jenis kumpulan. Anak elemen elemen "shiporder" dihalangi oleh elemen xs:sequence, yang menentukan urutan anak elemen:
<xs:element name="shiporder"> <xs:complexType> <xs:sequence> ... ... </xs:sequence> ... </xs:complexType> </xs:element>
Kemudian, kita perlu menentukan elemen "orderperson" sebagai jenis sederhana (ini karena ia tidak mengandung apa-apa atribut atau elemen lain). Prefiks tipe (xs:string) ditentukan oleh prefix ruang nama, ruang nama ini berhubungan dengan XML schema yang menunjukkan jenis data schema yang pradefinisi:
<xs:element name="orderperson" type="xs:string"/>
Sekarang, saya perlu menentukan dua elemen sebagai jenis kumpulan: "shipto" dan "item". Kita 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>
Melalui schema, kami boleh 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 boleh memdefinikan elemen "item" ini. Elemen ini boleh muncul beberapa kali di dalam elemen "shiporder". Ini dicapai dengan menetapkan nilai maxOccurs atribut elemen "item" kepada "unbounded", jadi elemen "item" boleh muncul sebanyak yang diinginkan pencipta. Silakan perhatikan, elemen "note" adalah elemen pilihan. Kami telah menetapkan nilai minOccurs atribut elemen ini kepada 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>
現在,我們可以聲明 "shiporder" 元素的屬性了。由於這是一個必選屬性,我們規定 use="required"。
註釋:此屬性的聲明必須被置於最後:
<xs:attribute name="orderid" type="xs:string" use="required"/>
這是這個名為 "shiporder.xsd" 的 schema 文件的文件目錄:
<?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>
分割 Schema
前面的設計方法非常容易,但當文件很複雜時卻難以閱讀和维护。
接下來介紹的設計方法基於首先對所有元素和屬性的定義,然後再使用 ref 屬性來引用它們。
這是用新方法設計的 schema 文件:
<?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"/> <!-- 属性的定义 --> <xs:attribute name="orderid" type="xs:string"/> <!-- 繁合元素的定义 --> <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 jenis yang ditentukan (Named Types)
Kaedah rancangan ketiga mendefinikan kelas atau jenis, supaya kita dapat mengulangi penggunaan definisi elemen. Cara khususnya adalah: pertama, namakan elemen sederhana dan gabungan, kemudian arahkan ke mereka melalui atribut type elemen.
Ini adalah schema fail yang dirancang menggunakan kaedah 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 penghadapan menunjukkan bahwa tipe data berasal dari tipe data namespace W3C XML Schema. Oleh karena itu, bagian di bawah ini juga berarti bahwa nilai elemen atau atribut harus berupa nilai tipe teks:
<xs:restriction base="xs:string">
elemen penghadapan biasanya digunakan untuk menempatkan batasan bagi elemen. Lihat contoh 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 的数字。