یک مثال XSD

یہ فصل آپ کو XML شکیم لکھنے کا طور بتائے گا۔آپ بھی شکیم لکھنے کے مختلف طریقوں کو سیکھیں گے۔

XML مستند

آئیں، اس نام سے "shiporder.xml" والی 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 پارسیگر کو اطلاع دیتا ہے کہ اس مستند کو کسی شکیم کی بنیاد پر توثیق کریں۔یہ سطر: xsi:noNamespaceSchemaLocation="shiporder.xsd" شکیم کا مقام مقرر کرتا ہے (یہاں، یہ "shiporder.xml" کے ساتھ ایک فولدر میں موجود ہے)。

ایک XML اسکیم کا قیام

اب، ہمیں اس XML دستاویز کے لئے ایک اسکیم قائم کرنا چاہتا ہے۔

ہم ایک نئی فائل کا فتح کرسکتے ہیں، اور اس کو "shiporder.xsd" کا نام دینا چاہتا ہیں۔ اسکیم کی تشکیل کے لئے، ہم صرف XML دستاویز کی ساخت کی دقت سے دنبال کرتے ہیں، جس میں ہم کسی بھی عنصر کی تعریف کرتے ہیں۔ ابتدا میں، ہم ایک معیاری XML اعلان کی تعریف شروع کرتے ہیں:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...
</xs: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 اسکیم سے مربوط ہوتا ہے:

<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" عنصر کے اندر کئی بار آ سکتا ہے۔ یہ اس طریقے سے ممکن ہوتا ہے کہ ہم "item" عنصر کی maxOccurs اپریشن کی قیمتی کو "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>

شکستن شمای

روش طراحی قبلی بسیار آسان است، اما وقتی که مستند بسیار پیچیده است، خواندن و نگهداری از آن دشوار می‌شود.

روش طراحی آینده بر اساس تعریف ابتدایی همه عناصر و صفات است، سپس از ویژگی 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>

عین نوعیت (نام زدہ نوعیت) کا استعمال

تیسرے ڈیزائن طریقے نے کلاس یا نوعیتوں کو طے کیا ہے، جس سے ہم عناصر کی تعریف کو دوبارہ استعمال کرنے کی قابلیت حاصل کرتے ہیں۔ خاص طور پر اس کا طریقہ یہ ہے: ابتدا میں سادے عناصر اور ترکیبی عناصر کو نام دیا جاتا ہے، بعد میں عناصر کی type خاصیت کے ذریعے ان کو نکالا جاتا ہے۔

یہ تیسرے طریقے کے ذریعے ڈیزائن کردہ schema فائل ("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>

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

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

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

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

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