یک مثال XSD

این بخش به شما نشان می‌دهد که چگونه یک XML Schema بنویسید. شما همچنین یاد خواهید گرفت که چگونه روش‌های مختلفی برای نوشتن schema وجود دارد.

مستند XML

بیایید به این مستند XML به نام "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>

مستند XML بالا شامل عنصر ریشه "shiporder" است که شامل ویژگی الزامی به نام "orderid" می‌باشد. عنصر "shiporder" شامل سه عنصر مختلف است: "orderperson"، "shipto" و "item". عنصر "item" دو بار ظاهر می‌شود و شامل یک "title"، یک عنصر "note" انتخابی، یک "quantity" و یک عنصر "price" است.

این خط xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"، به XML parser اطلاع می‌دهد که این مستند را بر اساس یک schema بررسی کند. این خط: xsi:noNamespaceSchemaLocation="shiporder.xsd" مکان schema را مشخص می‌کند (در اینجا، آن با "shiporder.xml" در یک پوشه مشابه قرار دارد).

یک XML Schema ایجاد کنید

اکنون، نیاز داریم برای این مستند XML یک schema ایجاد کنیم.

ما می‌توانیم با باز کردن یک فایل جدید شروع کنیم و این فایل را به نام "shiporder.xsd" نامگذاری کنیم. برای ایجاد schema، ما تنها نیاز داریم به سادگی ساختار یک مستند XML را دنبال کنیم و هر عنصری که پیدا می‌کنیم را تعریف کنیم. ابتدا یک تعریف استاندارد XML را آغاز می‌کنیم:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...
</xs:schema>

در schema بالا، ما از نام‌فضای استاندارد (xs) استفاده کرده‌ایم، که با URI Schema language definition مرتبط است، که ارزش استاندارد آن http://www.w3.org/2001/XMLSchema است.

در مرحله بعد، نیاز داریم "shiporder" عنصر را به عنوان نوع ترکیبی تعریف کنیم. این عنصر دارای یک ویژگی است که شامل عناصر دیگر است، بنابراین ما آن را نوع ترکیبی می‌دانیم. عناصر فرزند "shiporder" توسط عنصر xs:sequence احاطه شده‌اند و ترتیب عناصر را تعریف می‌کنند:

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

سپس نیاز داریم "orderperson" عنصر را به عنوان نوع ساده تعریف کنیم (این به دلیل اینکه این عنصر هیچ ویژگی یا عنصر دیگری را شامل نمی‌شود). پیشوند نوع (xs:string) توسط پیشوند نام‌فضا تعیین می‌شود، این نام‌فضا با XML schema مربوط به نوع داده‌های پیش‌تعریف شده schema مرتبط است:

<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>

با استفاده از schema، ما می‌توانیم با استفاده از ویژگی‌های maxOccurs و minOccurs تعداد ظهور یک عنصر را تعریف کنیم. maxOccurs تعداد بیشینه ظهور یک عنصر را تعریف می‌کند، در حالی که minOccurs تعداد کمینه ظهور یک عنصر را تعریف می‌کند. مقدار پیش‌فرض maxOccurs و minOccurs هر دو 1 است!

اکنون، ما می‌توانیم "item" عناصر را تعریف کنیم. این عنصر می‌تواند در داخل "shiporder" عناصر چندین بار ظاهر شود. این کار از طریق تنظیم مقدار maxOccurs ویژگی "item" عناصر به "unbounded" انجام می‌شود، به این ترتیب "item" عناصر می‌تواند به هر تعداد که سازنده می‌خواهد ظاهر شود. توجه داشته باشید که "note" یک عنصر اختیاری است. ما مقدار minOccurs ویژگی این عنصر را به 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" است:

<?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 برای ارجاع به آن‌ها استوار است.

این فایل شمای جدید با استفاده از روش جدید طراحی شده است:

<?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>

از نوع‌های مشخصه (Named Types) استفاده می‌شود

روش طراحی سوم کلاس‌ها یا نوع‌ها را تعریف می‌کند، به این ترتیب ما قادر به استفاده مجدد از تعریف عناصر می‌شویم. روش خاص به این صورت است: ابتدا عناصر ساده و ترکیبی نام‌گذاری می‌شوند، سپس از طریق属性 type به آن‌ها اشاره می‌شود.

این فایل شماتیک ("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>

عنصر restriction نشان‌دهنده نوع داده‌ای است که از فضای نام W3C XML Schema نشأت می‌گیرد. بنابراین، این بخش به این معناست که مقدار عناصر یا ویژگی‌ها باید از نوع رشته باشند:

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

عنصر restriction معمولاً برای اعمال محدودیت بر روی عناصر استفاده می‌شود. به این بخش‌های زیر از schema مراجعه کنید:

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

این کد نشان می‌دهد که ارزش عنصر یا ویژگی باید یک رشته باشد و باید شش کاراکتر پیاپی باشد و این کاراکترها باید از اعداد 0-9 باشند.