أحدث البرامج التعليمية وتطوير الشبكة
 

وXSD مثال


وهذا الفصل شرح كيفية كتابة مخطط XML. سوف تتعلم أيضا أن المخطط يمكن أن تكون مكتوبة بطرق مختلفة.


مستند 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" يقول محلل XML التي يجب التحقق من صحة هذه الوثيقة ضد مخطط. السطر: XSI: noNamespaceSchemaLocation = "shiporder.xsd" يحدد حيث يوجد مخطط (here it is in the same folder as "shiporder.xml") .


إنشاء مخطط XML

الآن نريد أن إنشاء مخطط للمستند 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>

في المخطط أعلاه نحن نعتقد استخدام مساحة الاسم القياسي (xs) ، وأوري المرتبطة بهذا مساحة الاسم هو تعريف لغة مخطط، والتي لديها قيمة قياسية من 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) مسبوقة مع بادئة مساحة الاسم المقترن مع مخطط 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>

يشير إلى عنصر تقييد أن نوع البيانات مشتق من مساحة اسم نوع البيانات W3C مخطط XML. لذا، فإن جزء التالية يعني أن قيمة العنصر أو سمة يجب أن تكون قيمة السلسلة:

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