บทนี้จะแสดงให้เห็นวิธีการเขียน XML Schema นอกจากนี้คุณยังจะได้เรียนรู้ว่าคีสามารถเขียนในรูปแบบที่แตกต่างกัน
เอกสาร XML
ลองมาดูที่เอกสาร XML นี้เรียกว่า "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>
เอกสาร XML ข้างต้นประกอบด้วยองค์ประกอบราก "shiporder" ที่มีแอตทริบิวต์ที่จำเป็นเรียกว่า "orderid" "shiporder" องค์ประกอบที่มีสามองค์ประกอบของเด็กแตกต่างกัน: "orderperson" , "shipto" และ "item" "item" องค์ประกอบที่ปรากฏขึ้นสองครั้งและมันมี "title" , เลือก "note" องค์ประกอบเป็น "quantity" และ "price" องค์ประกอบ
บรรทัดด้านบน: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" บอก parser XML ที่เอกสารนี้ควรได้รับการตรวจสอบกับสคีมา บรรทัด: xsi: noNamespaceSchemaLocation = "shiporder.xsd" ระบุตำแหน่งที่อยู่ของสคี (here it is in the same folder as "shiporder.xml")
สร้าง XML Schema
ตอนนี้เราต้องการที่จะสร้างสคีสำหรับเอกสาร XML ดังกล่าวข้างต้น
เราเริ่มต้นด้วยการเปิดไฟล์ใหม่ที่เราจะเรียก "shiporder.xsd" เพื่อสร้างสคีมาเราก็สามารถปฏิบัติตามโครงสร้างในเอกสาร XML และกำหนดแต่ละองค์ประกอบในขณะที่เราพบว่ามัน เราจะเริ่มต้นด้วยการประกาศมาตรฐาน XML ตามด้วย XS: องค์ประกอบที่กำหนดสคีมาคีมา:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>
ในสคีมาข้างต้นเราใช้ namespace มาตรฐาน (xs) และ URI ที่เกี่ยวข้องกับ namespace นี้เป็นคำนิยามภาษาแบบแผนซึ่งมีค่ามาตรฐานของ http://www.w3.org/2001/XMLSchema
ต่อไปเราจะต้องกำหนด "shiporder" องค์ประกอบ องค์ประกอบนี้มีแอตทริบิวต์และจะมีองค์ประกอบอื่น ๆ ดังนั้นเราจึงคิดว่ามันเป็นชนิดที่มีความซับซ้อน องค์ประกอบลูกของ "shiporder" องค์ประกอบที่ล้อมรอบด้วย XS: องค์ประกอบลำดับที่กำหนดลำดับการสั่งซื้อขององค์ประกอบย่อย:
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
...
</xs:sequence>
</xs:complexType>
</xs:element>
แล้วเราจะต้องกำหนด "orderperson" องค์ประกอบเป็นชนิดที่เรียบง่าย (เพราะมันไม่ได้มีคุณลักษณะหรือองค์ประกอบอื่น ๆ ) ประเภท (xs:string) จะนำหน้าด้วยคำนำหน้า namespace ที่เกี่ยวข้องกับ Schema XML ที่ระบุว่ามีการกำหนดไว้ล่วงหน้าชนิดข้อมูลสคี:
<xs:element name="orderperson" type="xs:string"/>
ต่อไปเราจะต้องกำหนดสององค์ประกอบที่มีความซับซ้อนชนิด: "shipto" และ "item" เราเริ่มต้นด้วยการกำหนด "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>
ด้วยสกีมาเราสามารถกำหนดหมายเลขของเหตุการณ์ที่เป็นไปได้สำหรับองค์ประกอบกับ maxOccurs และแอตทริบิวต์ minOccurs maxOccurs ระบุจำนวนสูงสุดของการเกิดขึ้นสำหรับองค์ประกอบและ minOccurs ระบุจำนวนขั้นต่ำของการเกิดขึ้นสำหรับองค์ประกอบ ค่าเริ่มต้นสำหรับทั้ง maxOccurs และ minOccurs 1!
ตอนนี้เราสามารถกำหนด "item" องค์ประกอบ องค์ประกอบนี้สามารถปรากฏหลายครั้งภายใน "shiporder" องค์ประกอบ นี้จะถูกระบุโดยการตั้งค่า maxOccurs แอตทริบิวต์ของ "item" องค์ประกอบ "unbounded" ซึ่งหมายความว่าจะมีเป็นจำนวนมากที่เกิดขึ้นของ "item" องค์ประกอบที่เป็นความปรารถนาของผู้เขียน ขอให้สังเกตว่า "note" องค์ประกอบเป็นตัวเลือก เราได้ระบุไว้โดยการตั้งค่า minOccurs แอตทริบิวต์ศูนย์:
<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" องค์ประกอบ ตั้งแต่นี้เป็นแอตทริบิวต์ที่จำเป็นที่เราระบุการใช้ = "จำเป็น"
Note: ชี้แจงแอตทริบิวต์มักจะต้องมาครั้งสุดท้ายเมื่อ:
<xs:attribute name="orderid" type="xs:string" use="required"/>
นี่คือรายการที่สมบูรณ์ของไฟล์คีเรียกว่า "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>
แบ่งแบบแผน
วิธีการออกแบบก่อนหน้าเป็นเรื่องง่ายมาก แต่อาจเป็นเรื่องยากที่จะอ่านและรักษาเมื่อเอกสารที่มีความซับซ้อน
วิธีการออกแบบต่อไปจะขึ้นอยู่กับการกำหนดองค์ประกอบทั้งหมดและแอตทริบิวต์แรกและจากนั้นพวกเขาหมายถึงการใช้ ref แอตทริบิวต์
นี่คือการออกแบบใหม่ของแฟ้มสคี ("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>
โดยใช้ชื่อประเภท
วิธีการออกแบบที่สามกำหนดชั้นเรียนหรือชนิดที่ช่วยให้เราสามารถนำมาใช้ใหม่นิยามองค์ประกอบ นี้จะกระทำโดยการตั้งชื่อ simpleTypes และ complexTypes องค์ประกอบแล้วชี้ไปที่พวกเขาผ่าน type แอตทริบิวต์ขององค์ประกอบ
นี่คือการออกแบบที่สามของแฟ้มสคี ("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>
องค์ประกอบที่บ่งชี้ว่าข้อ จำกัด ประเภทข้อมูลที่ได้มาจาก namespace ที่ประเภทข้อมูล W3C XML Schema ดังนั้นส่วนต่อไปนี้หมายความว่าค่าขององค์ประกอบหรือแอตทริบิวต์จะต้องเป็นค่าสตริง:
<xs:restriction base="xs:string">
องค์ประกอบข้อ จำกัด มากขึ้นมักจะใช้ในการใช้ข้อ จำกัด กับองค์ประกอบ ดูบรรทัดต่อไปนี้จากคีมาข้างต้น
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
นี้บ่งชี้ว่าค่าขององค์ประกอบหรือแอตทริบิวต์ต้องเป็นสตริงก็ต้องตรงหกตัวอักษรในแถวและตัวอักษรเหล่านั้นต้องเป็นตัวเลข 0-9