یک نمونه XSD

本节会为您演示如何编写一个 XML Schema。您还将学习到编写 schema 的不同方法。

XML 文档

让我们看看这个名为 "shiporder.xml" 的 XML 文档:



 George Bush
 
  John Adams
  
Oxford Street
London UK
Empire Burlesque Special Edition 1 10.90 Hide your heart 1 9.90

上面的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 Schema ایجاد کنید

حالا، نیاز داریم که برای این 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 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>

از طریق شماتیک، ما میتوانیم مقادیر 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>

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

تیسرے ڈیزائن طریقے نے کلاس یا نوعیتوں کو تعریف کیا ہے، جس سے ہم عناصر کی تعریف کو دوبارہ استعمال کرنے کی صلاحیت حاصل کرتے ہیں۔ خاص طور پر: ابتدا میں سادے عناصر اور کمپوزٹ عناصر کو نام دیا جاتا ہے، بعد میں عناصر کی 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 باشند.