مثال على XSD
- الصفحة السابقة استبدال العناصر XSD
- الصفحة التالية النص 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".
سطر فوق هذا يُخبر معالج XML بأنه يجب عليه التحقق من هذا المستند بناءً على schema معين. السطر التالي: xsi:noNamespaceSchemaLocation="shiporder.xsd" يحدد موقع schema (في هذا الملف، هو في نفس المجلد مع "shiporder.xml").
إنشاء XML Schema
الآن، نحتاج إلى إنشاء نموذج لجدول البيانات أعلاه.
يمكننا البدء بفتح ملف جديد، ونسميه "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 (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" كنوع بسيط (وهذا لأنه لا يحتوي على أي خصائص أو عناصر أخرى). يحدد بدء السلسلة من قبل مقدم الاسم المحدد من قبل المقدمة، هذا المقدمة مرتبطة بنمذجة XML المحددة التي تشير إلى أنواع البيانات المسبقة للنمذجة 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 لهذا العنصر إلى 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" 的 schema 文件的文档清单:
<?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 属性来引用它们。
这是用新方法设计的 schema 文件:
<?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>
يظهر عنصر restriction أن نوع البيانات المصدرة من نوع بيانات مسمى مساحة W3C XML Schema. لذلك، يعني الجزء التالي أن قيمة العنصر أو الخاصية يجب أن تكون قيمة نصية:
<xs:restriction base="xs:string">
يستخدم عنصر restriction عادةً لتقديم حدود على العنصر. انظر إلى هذه الفragments من schema السابق:
<xs:simpleType name="orderidtype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType>
هذا الكود يشير إلى أن قيمة العنصر أو الخاصية يجب أن تكون نصية وأن تكون متسلسلة من ستة أحرف متتالية، وأن تكون هذه الأحرف أرقامًا من 0 إلى 9.
- الصفحة السابقة استبدال العناصر XSD
- الصفحة التالية النص XSD