دروس XML

الصفحة الرئيسية لـ XML مقدمة XML كيفية استخدام XML شجرة XML بناء جملة XML عناصر XML سمات XML مساحات أسماء XML عرض XML طلب XML HttpRequest محلل XML XML DOM XML XPath XML XSLT XML XQuery XML XLink مدقق XML XML DTD مخطط XML خادم XML أمثلة XML مسابقة XML شهادة XML

XML AJAX

مقدمة أجاكس أجاكس XMLHttp طلب AJAX استجابة AJAX ملف AJAX XML أجاكس بي إتش بي أجاكس آسيا والمحيط الهادئ قاعدة بيانات أجاكس تطبيقات أجاكس أمثلة AJAX

XML DOM

مقدمة حول DOM عقد DOM الوصول إلى DOM معلومات عقدة DOM قائمة عقدة DOM عبور DOM التنقل في DOM DOM احصل على القيم DOM تغيير العقد DOM إزالة العقد استبدل DOM Nodes DOM إنشاء العقد DOM أضف العقد عقد استنساخ DOM أمثلة DOM

دروس XPath

مقدمة XPath عقد XPath بناء جملة XPath محاور XPath مشغلي XPath أمثلة XPath

XSLT التعليمي

XSLT مقدمة لغات XSL تحويل XSLT XSLT <template> XSLT <قيمة> XSLT <للجميع> XSLT <ترتيب> XSLT <if> XSLT <اختر> XSLT تطبيق XSLT على العميل XSLT على الخادم XSLT تحرير XML أمثلة XSLT

XQuery تعليمي

XQuery مقدمة مثال XQuery XQuery FLWOR XQuery HTML شروط XQuery بناء جملة XQuery XQuery إضافة XQuery حدد وظائف XQuery

XML DTD

مقدمة DTD مكعبات بناء DTD عناصر DTD سمات DTD عناصر DTD مقابل Attr كيانات DTD أمثلة DTD

مخطط XSD

مقدمة XSD XSD كيف XSD <المخطط عناصر XSD سمات XSD قيود XSD

مجمع XSD

عناصر XSD XSD فارغ عناصر XSD فقط نص XSD فقط XSD مختلط مؤشرات XSD XSD <أي> XSD <أي سمة> تبديل XSD مثال XSD

بيانات XSD

سلسلة XSD تاريخ XSD XSD الرقمية XSD متفرقات مرجع XSD

خدمات الويب

خدمات XML XML WSDL صابون XML XML RDF XML RSS

مراجع

أنواع عقدة DOM عقدة DOM قائمة عقدة DOM DOM NamedNodeMap مستند DOM عنصر DOM سمة DOM نص DOM DOM CDATA تعليق DOM DOM XMLHttpRequest محلل DOM عناصر XSLT وظائف XSLT / XPath

مثال 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 أعلاه من عنصر جذر ، "أمر الشحن" ، الذي يحتوي على سمة مطلوبة تسمى "معرّف الطلب". يحتوي عنصر "أمر الشحن" على ثلاثة عناصر فرعية مختلفة: "orderperson" و "shipto" و "item". يظهر عنصر "العنصر" مرتين ، ويحتوي على "عنوان" ، وعنصر "ملاحظة" اختياري ، وعنصر "كمية" ، وعنصر "سعر".

السطر أعلاه: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" يخبر المحلل اللغوي XML أنه يجب التحقق من صحة هذا المستند مقابل مخطط. السطر: xsi: noNamespaceSchemaLocation = "shiporder.xsd" يحدد مكان وجود المخطط (هنا في نفس المجلد مثل "shiporder.xml").



قم بإنشاء مخطط XML

الآن نريد إنشاء مخطط لمستند XML أعلاه.

نبدأ بفتح ملف جديد نسميه "shiporder.xsd". لإنشاء المخطط ، يمكننا ببساطة اتباع الهيكل في مستند XML وتحديد كل عنصر كما نجده. سنبدأ بإعلان XML القياسي متبوعًا بعنصر xs: schema الذي يعرّف المخطط:

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

في المخطط أعلاه ، نستخدم مساحة الاسم القياسية (xs) ، و URI المرتبط بمساحة الاسم هذه هو تعريف لغة المخطط ، والتي لها القيمة القياسية http://www.w3.org/2001/XMLSchema.

بعد ذلك ، علينا تحديد عنصر "أمر الشحن". هذا العنصر له خاصية ويحتوي على عناصر أخرى ، لذلك نعتبره نوعًا معقدًا. العناصر الفرعية لعنصر "أمر الشحن" محاطة بـ 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!

الآن يمكننا تحديد عنصر "العنصر". يمكن أن يظهر هذا العنصر عدة مرات داخل عنصر "أمر شحن". يتم تحديد ذلك من خلال تعيين السمة maxOccurs لعنصر "العنصر" على "غير محدود" مما يعني أنه يمكن أن يكون هناك عدد تكرارات لعنصر "العنصر" كما يرغب المؤلف. لاحظ أن عنصر "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>

يمكننا الآن الإعلان عن سمة عنصر "أمر الشحن". نظرًا لأن هذه سمة مطلوبة ، فإننا نحدد use = "required".

ملاحظة: يجب أن تأتي تصريحات السمات دائمًا أخيرًا:

<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 ، ثم الإشارة إليهم من خلال سمة النوع الخاصة بالعنصر.

إليك التصميم الثالث لملف المخطط ("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 Schema. إذن ، الجزء التالي يعني أن قيمة العنصر أو السمة يجب أن تكون قيمة سلسلة:

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