مثال (XSD Example)
در این صفحه، یک «نمونه XSD» را گام به گام می سازیم. «طرح واره (Schema)» قانون های ساخت XML است. مثل دفترچه قانون بازی که می گوید هر کارت کجا باشد.
سند XML نمونه
این سند، سفارش حمل را نشان می دهد. ریشه «shiporder» است. یک ویژگی اجباری «orderid» دارد. سپس «orderperson»، «shipto» و چند «item» می آیند.
<?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>
نکته: ویژگی «xsi:noNamespaceSchemaLocation» آدرس فایل XSD را می دهد.
شروع طرح واره XSD
اول فایل «shiporder.xsd» را می سازیم. سپس «xs:schema» را می نویسیم. این ریشه طرح واره است.
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
</xs:schema>
تعریف ریشه و عناصر ساده
عنصر «shiporder» پیچیده است. چون داخلش عناصر دیگر می آید. پس یک «complexType» با «xs:sequence» می سازیم.
<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>
هشدار: تعریف ویژگی ها باید در انتهای complexType بیاید.
طراحی دوم: تعریف و ارجاع
می توانیم همه عناصر را جدا تعریف کنیم. سپس با «ref» به آن ها ارجاع دهیم. این روش خوانایی را بهتر می کند.
<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>
طراحی سوم: نوع های نام دار
می توانیم «نوع های نام دار (Named Types)» بسازیم. سپس آن ها را در عناصر استفاده کنیم. این کار بازاستفاده را آسان می کند.
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="shipordertype">
<xs:sequence>
<xs:element name="orderperson" type="xs:string" />
<xs:element name="shipto" type="shiptotype" />
<xs:element name="item" type="itemtype" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="orderid" type="orderidtype" use="required" />
</xs:complexType>
<xs:element name="shiporder" type="shipordertype" />
نکته: «restriction» یعنی محدودیت روی نوع. الگو بالا فقط شش رقم می پذیرد.
گام های عملی
- ساخت shiporder.xsd و افزودن xs:schema.
- تعریف shiporder با sequence و فرزندان.
- افزودن orderid و اجباری کردن آن.
جمع بندی سریع
- سه سبک طراحی XSD داریم.
- ref خوانایی طرح را بهتر می کند.
- Named Types بازاستفاده را ساده می کند.
- pattern محدودیت مقدار را اجرا می کند.
مثال XSD مرجع این صفحه است.
برای جایگزینی عناصر ببینید: جایگزینی (XSD Substitution). برای نوع رشته ها مراجعه کنید: رشته ها در XSD.