XSD چيست ؟
پس از عرضه XML ، مجموعه ای از تکتولوژی های ديگر در رابطه با آن و با هدفمندی خاصی مطرح و ارائه گرديده است  . بهمين دليل است که امروزه XML بعنوان خانواده ای بزرگ از ساير تکنولوژی ها  در نظر گرفته  می شود .XSD) XML Schema Definition) ،  يکی از تکنولوژی های موجود در اين زمينه است. در مجموعه مقالاتی که در اين رابطه ارائه  خواهد شد،  به بررسی جايگاه XSD  و نحوه ارتباط آن با XML خواهيم پرداخت . در اين مقاله ، به  بررسی ضرورت استفاده از XSD و معرفی برخی از ويژگی های آن اشاره خواهد شد .
چرا به Schema نياز است ؟
يکی از مزايای مهم XML ،ارائه انعطاف  و تسهيلات لازم برای طراحان و پياده کنندگان  در رابطه با تشريح ساختار داده ها است. سندهای XML ، دارای مخاطبان خاص خود ( انسان و يا ساير برنامه های کامپيوتری ) بوده و می بايست امکانات لازم از زاويه استفاده کننده نيز مورد توجه قرار گيرد . در اين رابطه می بايست مجوزهای لازم بمنظور ارائه هر يک از عناصر و يا خصلتهای موجود در سند مشخص گردد.ترتيب عناصر و خصلت های موجود در يک سند XML نيز بسيار حائز اهميت بوده  و همواره مورد نياز منابعی خواهد بود  که بنحوی از سندهای XML بعنوان ساختاری برای تامين داده های خود استفاده می نمايند. همانگونه که اشاره شد، سندهای XML ممکن است توسط انسان و يا ساير برنامه ها و نرم افزارها استفاده گردند. بديهی است با فراگير شدن استفاده از داده ها با فرمتی که توسط سندهای XML مطرح می گردد ،انتظار حمايت از انواع داده ها که در ساير زبانهای برنامه نويسی نظير  Java، VB، C++ ، SQL وجود دارد ،بشدت مورد نياز خواهد بود. پياده کنندگان سندهای XML  بدنبال يک راهکار مناسب برای تعريف نوع داده ها  (Date ،  String ، Integer)  و ساير موارد مربوط به قانونمند نمودن ساختار داده ها در رابطه با يک سند XML بودند .بدين ترتيب تعريف Schema برای سندهای  XML ، امری حياتی و ضروری تلقی گرديد .

Schema ، محتوای  مجاز يک کلاس از اسناد XML را تشريح مي کند.

تاريخچه XML Schema
برای نوشتن سندهای XML ،در ابتدا از شکل ساده ای از زبان نشانه گذاری SGML استفاده می گرديد .SGML ، صرفا” برای نشانه گذاری اسناد مورد استفاده قرار می گرفت . جايگاه استفاده از XML در ابتدا برای  برنامه نويسان مشخص نبود و اکثر عرضه کنندگان مرورگرهای وب ، از تکنولوژی فوق حمايت نمی کردند . پس از مدت زمان کوتاهی، تکنولوژی XML  جايگاه خاصی را در بين متقاضيان خصوصا” برنامه نويسان پيدا کرد . اکثر استفاده کنندگان به اين نکته  پی بردند که XML گزينه ای مناسب برای اکثر نيازهای آنان بوده و کاربرد  آن بسيار فراتر از نشانه گذاری اسناد است .
در زمان عرضه XML 1.0 توسط کنسرسيوم وب ، از تکنولوژی DTD برای تشريح سندهای XML استفاده می گرديد . گرامر استفاده شده در DTD ، پاسخگوی برخی از نيازهای جديد  خصوصا” در رابطه با  انتقال اطلاعات بود . در ادامه  نياز های جديدی در رابطه با پردازش داده های موجود در اسناد XML  مطرح گرديد . بمنظور ارائه قابليت فوق برای منابع مصرف کننده ، می بايست امکاناتی بمنظور تشريح مناسب داده ها ( ارتباط ، نوع داده و … )  در اختيار برنامه نويسان قرار گيرد . بدين ترتيب برنامه نويسان  قادر به تشخيص رفتار داده ها در يک سند XML و انجام پردازش های لازم  در رابطه با داده های موجود در يک سند XML خواهند بود . بمنظورپاسخ مناسب به خواسته های فوق ، کنسرسيوم وب تصميم به طراحی يک زبان  توصيفی جديد با نام XML Schema  گرفت . در اين رابطه يک گروه کاری با همين نام تاسيس گرديد . مهمترين هدف گروه فوق، ايجاد يک زبان توصيفی جديد  با قابليت استفاده توسط استفتاده کنندگان ، توليدکنندگان و برنامه نويسان  با توجه به طيف گسترده انتظارات هر گروه بود . گروه XML Schema  کنسرسيوم وب ، فعاليت خود را از فوريه سال 1999 آغاز و پس از دو سال در 2001  موفق به طراحی زبان توصيفی شدند . تکنولوژی فوق با نام XML Schema Definition  و يا XSD  معرفی گرديد . در زمانيکه گروه فوق ، سرگرم طراحی زبان توصيفی خود بودند، راهکارهای متفاوتی در اين خصوص توسط ساير شرکت ها ارائه گرديد . مثلا” شرکت ماکروسافت تکنولوژی XDR را  عرضه نمود . تکنولوژی  استاندارد شده  کنسرسيوم وب ، در مدت زمان کوتاهی پس از عرضه ، بعنوان گزينه ای مناسب برای تشريح ساختار داده ها ی موجود در يک سند XML ، مورد توجه عموم متقاضيان  قرار گرفت .

ويژگی های مهم XSD

  • فرمت آن همانند يک سند XML است. بنابراين ضرورتی به فراگيری گرامر جديدی  برای ايجاد XSD  نخواهد بود  . بدين ترتيب می توان از  تمام ابزارهای موجود در رابطه با سندهای  XML ، در ارتباط با XSD نيز استفاده کرد .
  • ضمن حمايت از انواع داده (Data Type) تعريف شده در اکثر زبانهای برنامه سازی، امکان تعريف نوع  داده مورد نظر استفاده کننده  را  نيز فراهم می نمايد . بدين ترتيب  می توان محتويات  سند را محدود به نوع داده مورد استفاده در نرم افزار خود نمود و يا حتی از خصلت فيلدهای موجود در بانک اطلاعاتی کپی برداری کرد .
  • امکان  تعريف کليد يکتا (Key) در عناصر اطلاعاتی را بمنظور عمليات يکتا سازی(Uniqe)  فراهم می نمايد .
  • از خصلت توارث مدل شئ گراء ، بخوبی تبعيت می نمايد . بدين ترتيب  يک توصيف می تواند از توصيف ديگر به ارث رسيده باشد .ويژگی فوق ،  توانائی توليد توصيف هائی با قابليت استفاده مجدد را ميسر می سازد .
  • امکان تعريف عناصر با  ارزش NULL  ،  و يا فاقد ارزش ،   در XSD وجود دارد .
  • از Namespace  بخوبی حمايت می نمايد . بدين ترتيب امکان توصيف اسناد با استفاده از  Namespace مختلف فراهم می گردد . اين ويژگی در راستای توليد توصيف هائی با قابليت استفاده مجدد است .
  • اسناد XSD ، نيز نظير سندهای  XML ،   توسط پارسر اعتبار سنجی شده و در صورت وجود خطا ء  گزارشات لازم ارائه می گردد .

در بخش دوم ، به بررسی  گرامر XSD  خواهيم پرداخت .


XSD چيست ؟( بخش دوم )
در بخش اول  اين مقاله ، به  بررسی ضرورت استفاده از XSD و معرفی برخی از ويژگی های آن اشاره گرديد، در بخش دوم به بررسی  گرامر XSD  خواهيم پرداخت .

گرامر XSD
برای تشريح گرامر XSD ،در ابتدا به  ذکر يک مثال پرداخته و سپس المانهای موجود در آن  تشريح می گردد. جدول زير نمونه سند XML  را نشان می دهد :

يک سند نمونه XML

<?XML Version = “1.0”?>
<Students>
<Student>
<ID>12345</ID>
<GPA>3.5</GPA>
</Student>
<Student>
<ID>67890</ID>
<GPA>4.0</GPA>
</Student>
</Students>

توصيف سند فوق، بر اساس متد XSD بصورت زير است :

توصيف سند XML با استفاده از متد XSD

<?XML Version = “1.0”?>
<XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
<XSD:Element Name=”student” Minoccurs=”0″ MaxOccurs=”Unbounded”/>
<XSD:ComplexType>
<XSD:Sequence>
<XSD:Element Name=”ID” Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Element Name=”GPA” Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
</XSD:Sequence>
</XSD:ComplexType>
</XSD:Element>
</XSD:Schema>

در ادامه با توجه به سند XML اشاره شده  وXSD مربوطه ، به تجزيه و تحليل توصيف تعريف شده خواهيم پرداخت .

اعلاميه XML
با توجه به اينکه XSD خود يک سند XML است ، پس خط اول آن ميتواند يک اعلاميه XML باشد . (به خط اول توصيف تعريف شده XSD توجه نمائيد )

<?XML Version = “1.0”?>

المان ريشه  در توصيف XSD
المان ريشه در يک سند XSD ،همواره با تگ  <Schema> مشخص می گردد . بمنظور اعلام به پارسر XML که توصيف ارائه شده از روش XSD تبعيت می نمايد ، لازم است Namespace مرجع در المان <schema> تعيين گردد. Namespace  فوق  توسط کنسرسيوم وب ارائه شده  است .(به خط دوم توصيف تعريف شده XSD توجه نمائيد )

    <XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
.
.
.
</XSD:Schema>

نکته : پيشوند  XSD که در مثال فوق از آن استفاده شده است، نشاندهنده متد بکارگرفته شده  بمنظور توصيف سند است . پيشوند فوق ، در صورت تعريف در NameSpace مرجع ، می تواند هر چيز ديگری را نيز شامل شود . همچنين اگر NameSpace مربوطه بصورت پيش فرض مشخص گردد ، می توان آن را حذف نمود. پيشنهاد می گردد بمنظور افزايش خوانائی سند و همچنين جلوگيری از مشکلات آتی خصوصا” زمانی که در توصيف مربوطه از توصيف ديگری

XSD چيست ؟( بخش سوم )
در بخش اول اين مقاله به بررسی  مقاهيم و جايگاه نکنولوژی XSD اشاره  و در بخش دوم به بررسی  بررسی  گرامر XSD   پرداخته گرديد . در اين بخش به بررسی انواع داده ساده ( simple type ) و مرکب ( complex type ) ، خواهيم پرداخت .

انواع داده ( ساده ، مرکب )
جهت توصيف داده ها در يک سند XML با استفاده از تکنولوژی XSD ، از دو نوع  ساده و مرکب استفاده می گردد که بمنظور بکارگيری آنان در گرامر XSD  ، نشانه هائی با همين عنوان يعنی <SimpleType> و <ComplexType>  در نظر گرفته شده است . قبل از تشريح هر يک از موارد فوق ، لازم است جايگاه استفاده از هر يک بدرستی مشخص گردد .

نوع داده مرکب <ComplexType> زمانی استفاده ميگردد که :

  • عنصر داده  دارای عناصر زير مجموعه باشد  و/  يا .
  • عنصر داده دارای خصائص (Attribute) باشد .

نوع داده ساده <SimpleType> زمانی استفاده ميگردد که :

  • تصميم داريم با اعمال شرايط و يا محدوديتهائی بر روی يک نوع داده استاندارد (مثل String) يک نوع داده جديد (User Define Data Type) ايجاد نمائيم  و / يا
  • عنصر مورد نظر دارای عناصر زير مجموعه و يا خصائص (Attribute) نمی باشد.

بمنظور آشنائی با برخی از مفاهيم اوليه در اين خصوص ، مجددا” به مثال ارائه شده در بخش دوم مقاله ، مراجعه می نمائيم .

يک سند XSD نمونه بمنظور بررسی انواع داده

<?XML Version = “1.0”?>
<XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
<XSD:Element Name=”student” Minoccurs=”0″ MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Sequence>
<XSD:Element Name=”ID” Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Element Name=”GPA” Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
</XSD:Sequence>
</XSD:ComplexType>
</XSD:Element>
</XSD:Schema>

درمثال فوق ،  عنصر Student دارای دو زير عنصر ID و GPA است. بنابراين می بايست عنصر Student بصورت مرکب توصيف گردد. بدين منظور لازم است پس از توصيف عنصر مربوطه و پيش از توصيف عناصر زير مجموعه آن از نشانه <ComplexType> استفاده شده  و در ادامه عناصر زير مجموعه را درون بلاکی  از اين نشانه قرار دهيم.( خطوط چهارم و نهم )
فرض کنيد ، می خواهيم بر روی عنصر GPA که از نوع استاندارد String است ، محدوديتی خاص را اعمال نمائيم،  بطوريکه طول آن چهار حرف  و فرمت آن به صورت (Digit.DigitDigit) باشد .بمنظور تامين خواسته فوق ، لازم است يک نوع داده جديد با لحاظ نمودن محدوديت اشاره شده ، بر روی نوع داده استاندارد String تعريف گردد . با توجه به ضرورت تعريف يک نوع داده جديد ، می بايست از نشانه <SimpleType> استفاده گردد . تشريح نوع داده جديد بر اساس تکنولوژی XSD ، بصورت زير خواهد بود. ( در مقالات بعد، بصورت مفصل تر به بررسی اعمال  محدوديت ، ارزش ها و الگوهای مختلف ، پرداخته خواهد شد ).

تعريف يک نوع داده ساده با اعمال محدوديت

<XSD:simpletype  name=”studentgpa”  minoccurs=”1″   maxoccurs=”1″>
<XSD:restriction  base=”XSD:string”>
<XSD:length  value=”4″/>
<XSD:pattern value=”\d{1}.\d{2}”/>
</XSD:restriction>
</XSD:simpletype>

با توجه به تعريف نوع ساده مورد نظر و لحاظ نمودن محدوديت های مربوطه ، سند XSD مثال قبل به شکل ذيل خواهد بود :

يک سند XSD نمونه بمنظور بررسی انواع داده با لحاظ نمودن محدوديت ( روش اول )

<?XML Version = “1.0”?>
<XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
<XSD:Element Name=”student” Minoccurs=”0″ MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Sequence>
<XSD:Element Name=”ID” Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Element Name=”GPA” Type=”StudentGpa”/>
</XSD:Sequence>
</XSD:ComplexType>
</XSD:Element>
<XSD:simpletype  name=”studentgpa”  minoccurs=”1″   maxoccurs=”1″>
<XSD:restriction  base=”XSD:string”>
<XSD:length  value=”4″/>
<XSD:pattern value=”\d{1}.\d{2}”/>
</XSD:restriction>
</XSD:simpletype>                                                                                                                 </XSD:Schema>

سند فوق، به شکل زير نيز می تواند ارائه گردد :

يک سند XSD نمونه بمنظور بررسی انواع داده با لحاظ نمودن محدوديت ( روش دوم )

<?XML Version = “1.0”?>
<XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
<XSD:Element Name=”student” Minoccurs=”0″ MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Sequence>
<XSD:Element Name=”ID” Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Element Name=”GPA” Type=”string”  minoccurs=”1″ maxoccurs=”1″/>
<XSD:simpletype >
<XSD:restriction  base=”XSD:string”>
<XSD:length  value=”4″/>
<XSD:pattern value=”\d{1}.\d{2}”/>
</XSD:restriction>
</XSD:simpletype>                                                                                                                               </XSD:Sequence>
</XSD:ComplexType>
</XSD:Element>
</XSD:Schema>

تفاوت موجود در ارتباط با هر يک از روش های ارائه شده به قابليـت استفاده مجدد از نوع تعريف شده برمی گردد. در حالت اول،  نوع داده جديد studentgpa را ميتوان در هر محلی از سند (در تشريح هر يک از عناصر ديگر ) استفاده کرد (قابليت استفاده مجدد). در حالت دوم، نوع تعريف شده صرفا” بر روی عنصر GPA اعمال و امکان استفاده مجدد از وجود نخواهد داشت (غير قابل استفاده مجدد) .

جمع بندی
بمنظور تشريح عناصر ( نوع ساده و يا نوع مرکب ) ، از سه روش متفاوت استفاده می گردد :

  • روش اول : ميتوان در يک خط نام عنصر و نوع آن و حداقل و حداکثر حضور آن در سند را تعيين نمود .در واقع روش فوق ، عليرغم اينکه از نشانه <Simpletype> استفاده  نشده است ، يک عنصر ساده را تشريح می نمايد.چرا که نوع داده اين نوع عناصر از انواع داده استاندارد بوده و در انتهای خط نيز توصيف با علامت ” / ” خاتمه يافته است . توصيف عناصر ID و GPA در مثال ابتدای مقاله از مصاديق اين روش توصيف عناصر است .

<XSD:element name=”name”  Type=”type”  minoccurs=”int”  maxoccurs=”int”/>

  • روش دوم : در اين روش نام عنصر، حداقل و حداکثر حضور آن در سند به عنوان عنصر مادر تشريح شده و سپس عناصر زير مجموعه آن در داخل يک بلاک <Complextype> تعيين ميگردند . اين نوع توصيف در  خصوص انواع داده مرکب يعنی عناصری که دارای زير مجموعه و يا خصائص (attribute) ميباشند، استفاده می گردد . توصيف عنصر Student در مثال ابتدای مقاله از مصاديق اين روش است .

تعريف يک نوع مرکب

 <XSD:Element Name=”name” Minoccurs=”int” MaxOccurs=”int”>
<XSD:ComplexType>
.
.
.
</XSD:ComplexType>
</XSD:Element>

  • روش سوم : در اين روش نام عنصر ، حداقل و حداکثر حضور آن در سند توصيف و سپس محدوديت اعمال شده بر روی نوع داده استاندارد در يک بلوک <Simpletype> جهت تعريف يک نوع داده جديد،  توصيف ميگردد. در واقع روش فوق، نوع ديگر توصيف انواع داده ساده Simpletype  بوده  که با اعمال محدوديت بر روی يکی از انواع داده استاندارد ايجاد شده است . تعريف studentgpa در مثال قبل از مصاديق بکارگيری اين روش در توصيف عناصر است.

تعريف يک نوع ساده

<XSD:element  name = “name”  minoccurs=”int”  maxoccurs=”int” />
<XSD:simpletype>
<XSD:restriction>
.
.
.
</XSD:restriction>
</XSD:simpletype>
</XSD:element>

 توانائی ايجاد انواع داده جديد با اعمال محدوديت بر روی انواع داده استاندارد از ويژگيهای بسيار مهم و توانمند تکنولوژی XSD ميباشد .
در بخش چهارم اين مقاله به بررسی خصلت ها ، خواهيم پرداخت .


XSD چيست ؟( بخش چهارم)
آنچه تاکنون گفته شده است :
بخش اول :  مقاهيم و جايگاه نکنولوژی XSD
بخش دوم :  گرامر XSD
بخش سوم :انواع داده ( ساده ، مرکب )
در اين بخش به بررسی Attribute خواهيم پرداخت .

در تشريح ساختار داده های يک موجوديت (Entity)  ، برخی مواقع  به اجزاء  و يا المانهائي برخورد خواهيم کرد  که ارتباط تنگاتنگی با موجوديت داشته و بنوعی بعنوان يک خصلت يا ويژگی موجوديت مورد بررسی ، شناخته می گردند.نحوه حضور اين اجزاء در ساختمان داده موجوديت از قبيل مقادير پيش فرض،مقادير ثابت يا خصلت تغيير ناپذيری از ويژگی های مهم اين اجزاء محسوب می گردند . بعنوان مثال فرض کنيد در يک سازمان بزرگ برای تشکيل پرونده پرسنل، از يک  فيلد اطلاعاتي با  نام مليت  استفاده می شود.بيش از 98 درصد پرسنل شرکت مزبور دارای مليت ايرانی بوده  و تنها ممکن است يک  و يا دو درصد از پرسنل ، مليت غير ايرانی داشته باشند.با توجه به وضعيت فوق ، می توان  فيلد مليت  را به صورت پيش فرض مقدار دهی  و از تکرار آن در سند XML مربوطه جلوگيری  و صرفا” مليت افراد غير ايرانی  را در سند مشخص نمود. در چنين مواردی علاوه بر حفظ يکپارچگی اطلاعات به مقدار زيادی در حجم اطلاعات سند XML  نيز صرفه جوئی خواهد شد . در تکنولوژی  XSD برای معرفی اينگونه اجزاء ، نشانه ای تحت عنوان <Attribute> پيش بينی  شده است . گرامر استفاده از attribute بصورت زير است :

گرامر استفاده از attribute

<XSD:attribute Name=”name” Type=”simple type”  Use=”how used”  Value=”value”/>

Name : نام Attribute را مشخص  و يک خصلت اجباری است .
Type : نوع داده attribute را مشخص و جزء خصلت های اجباری است ( نوع داده حتما” بايد از انواع داده ساده (simple type) باشد).
Use : نحوه استفاده از attribute را مشخص و می تواند مقادير زير  را داشته باشد :

توضيحات

مقدار نسبت داده شده

خصلت اجباری است

Required

خصلت دارای مقدار پيش فرض است

Default

خصلت دارای مقدار ثابت و غير قابل تغيير است

Fixed

خصلت اختياری است

Optional

خصلت محافظت شده است

Prohibited

Value : اگر ويژگی Use دارای ارزش Default و يا Fixed باشد آنگاه ارزش مورد نظر می بايست مشخص و در غير اينصورت نيازی به استفاده از ويژگی فوق ، نخواهد بود.

جايگاه فيزيکي و نحوه تعريف attribute در يک سند XSD
همانگونه که در بخش سوم اين مقاله اشاره گرديد ،  عناصر مرکب (ComplexType) عناصری هستند که دارا عناصر زير مجموعه و يا attribute باشند . بنابراين جايگاه فيزيکی attribute در داخل يک بلاک Complextype است (انتهای بلاک و پس از توصيف کليه عناصر زير مجموعه) . بمنظور بررسی نحوه استفاده از attribute ، مثال ارائه شده در بخش سوم اين مقاله را مجددا” بررسی می نمائيم .در مثال فوق ، قصد داريم عنصر ID را بصورت يک attribute تعريف  نمائيم . در چنين حالتی توصيف سند بصورت زير خواهد بود :

نحوه استفاده از Attribute در يک سند XSD

<?XML Version = “1.0”?>
<XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
<XSD:Element Name=”student” Minoccurs=”0″ MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Element Name=”GPA” Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Attribute Name=”ID”  Type=”XSD:String”  Use=”Required” />
</XSD:ComplexType>
</XSD:Element>
</XSD:Schema>

روش های توصيف attribute
جهت توصيف يک attribute از دو روش متفاوت استفاده می گردد . اگر نوع داده attribute مورد نظر از انواع داده استاندارد و يا از پيش تعريف شده باشد ، آنگاه طبق گرامر ارائه شده ، می توان  توصيف يک attribute را  بصورت زير انجام داد :

روش اول : توصيف يک Attribute

<XSD:attribute Name=”name” Type=”simple type”  Use=”how used”  Value=”value”/>

اما اگر بخواهيم نوع داده attribute را با اعمال محدوديت بر روی  يک نوع داده استاندارد تشريح نمائيم ، می توان از گرامر زير استفاده کرد :

روش دوم : توصيف يک Attribute

<XSD:attribute Name=”name”   Use=”how used”  Value=”value” >
<XSD:simpletype>
<XSD:restriction  Base=”simple type”>
<XSD:facet  Value=”value” />
</XSD:restriction>
</XSD:simpletype>
</XSD:attribute>

facet ، حالات و ارزش های متفاوت آن در مقالات بعد به طور مفصل بررسی خواهد شد. جهت تشريح بهتر روش دوم،  به بررسی يک مثال  ديگر می پردازيم . فرض کنيد که در مثال قبل ، قصد داريم  بر روی  نوع داده attribute ID ، محدوديتی خاصی را اعمال نمائيم :”طول رشته پنج و کاراکترهای آن عدد باشند ” ، در چنين حالتی توصيف سند بصورت زير خواهد بود :

مثال : توصيف يک سند با اعمال محدوديـت در رابطه با Attribute

<?XML Version = “1.0”?>
<XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
<XSD:Element Name=”student” Minoccurs=”0″ MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Element Name=”GPA” Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Attribute Name=”ID”    Use=”Required”>
<XSD:simpletype>
<XSD:restriction  Base=”XSD:String”>
<XSD:Length=”5″ />
<XSD:Pattern = “\d{5}” />
</XSD:restriction>
</XSD:simpletype>
</XSD:attribute>
</XSD:ComplexType>
</XSD:Element>
</XSD:Schema>

همانگونه که مشاهده می گردد ( با اندکی دقت ! ) ، توصيف های ارائه شده برای خصلت ID داخلی بوده و امکان استفاده مجدد از آن وجود نخواهد داشت . در صورت نياز به استفاده مجدد از توصيف يک Attribute در مکان هائی ديگر از سند ، می بايست توصيف Attribute مورد نظر در خارج از محدوده داخلی قرار گيرد .
در بخش پنجم اين مقاله به بررسی حالات متفاوت ساختار ، خواهيم پرداخت .


XSD چيست ؟( بخش پنجم)
آنچه تاکنون گفته شده است :
بخش اول :  مقاهيم و جايگاه نکنولوژی XSD
بخش دوم :  گرامر XSD
بخش سوم :انواع داده ( ساده ، مرکب )
بخش چهارم : بررسی Attribute
در اين بخش به بررسی نحوه تشريح يک عنصر در سند XSD  خواهيم پرداخت .
دو راه متفاوت جهت تشريح عناصر يک سند XML با استفاده از متد XSD وجود دارد:

  • روش اول : در اين روش ، زير مجموعه های يک عنصر و خصلت های آن در داخل يک بلاک <COMPLEXTYPE> و بعد از تعريف عنصر اصلی مستقر و  تشريح می گردند.روش  فوق ، توصيف داخلی يا Nested ناميده می شود .
  • روش دوم : در اين روش ، توصيف عناصر زير مجموعه در داخل بدنه اصلی Schema ارائه گرديده و سپس در داخل بلاک <Complextype>  به عناصر مربوطه مراجعه خواهد شد. روش فوق ، توصيف عمومی يا Global ناميده می شود.

انتخاب هر يک از روش های فوق در توصيف عناصر ، بستگی به ماهيت خود عنصر و ديدگاه طراح دارد . بعبارت ديگر اگر تعريف يک عنصر با نوع داده ساده حالت انحصاری داشته باشد و در ساير عناصر سند جاری و يا عناصر اسناد ديگر قصد استفاده از آنان وجود نداشته باشد ، مناسب است از روش اول بمنظور تشريح عنصر استفاده گردد. در صورت عدم تحقق شرايط فوق ، مناسب است از روش دوم استفاده گردد. در واقع روش دوم، امکان استفاده مجدد از  توصيف انجام شده را فراهم می نمايد.  مثال زير نحوه تشريح يک عنصر در سند XSD را نشان می دهد :

مثال : توصيف يک سند ( بررسی تعاريف عمومی و داخلی )

<?XML Version = “1.0”?>
<XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
<XSD:Element Name=”student” Minoccurs=”0″ MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Element Name=”ID”      Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Element Name=”GPA”  Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
</XSD:ComplexType>
</XSD:Element>
</XSD:Schema>

در مثال فوق،عنصر Student به عنوان يکي از زير مجموعه های عنصر ريشه يا همان Schema توصيف و لذا به عنوان يک تعريف عمومی مطرح و  می توان ازآن  در هر محل  ديگر سند جاری و يا حتی اسناد ديگر استفاده نمود . اما عناصر ID و GPA به صورت عناصر زير مجموعه عنصر Student و آنهم در داخل آن (Nested) تشريح گرديده اند، لذا توصيف اين عناصر صرفا” در عنصر Student معتبر بوده و در هيچ محل ديگر سند جاری و يا اسناد ديگر، قابل استفاده نخواهند بود . فرض کنيد در ساختار سند فوق ،عنصر ديگری با نام Teacher ، وجود داشته باشد که دارای  دو زير عنصر ID و GPA می باشد. با توجه به فرضيات فوق ، مناسب است از روش دوم استفاده و تعاريف مربوط به عناصر ID و GPA را در داخل عنصر ريشه قرار دهيم . بدين ترتيب ، قادر خواهيم بود از تعاريف دو عنصر فوق در عناصر Student و Teacher بصورت  يکسان استفاده نمائيم . به مثال ذيل توجه کنيد :

مثال : توصيف يک سند و ضرورت استفاده از تعريف عمومی

<?XML Version = “1.0”?>
<XSD:Schema xmlns:xsd=’http://www.W3.org/2001/xmlschema’>
<XSD:Element Name=”student” Minoccurs=”0″ MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Element Ref=”ID”      MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Element Ref=”GPA”  MinOccurs=”1″ MaxOccurs=”1″/>
</XSD:ComplexType>
</XSD:Element>
<XSD:Element Name=”Teacher” Minoccurs=”0″ MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Element Ref=”ID”      MinOccurs=”1″ MaxOccurs=”1″/>
<XSD:Element Ref=”GPA”  MinOccurs=”1″ MaxOccurs=”1″/>
</XSD:ComplexType>
</XSD:Element>
<XSD:Element Name=”ID”     Type=”XSD:String”/>
<XSD:Element Name=”GPA” Type=”XSD:String”/>
</XSD:Schema>

در مثال فوق ، از خصلت Ref در مقابل Name استفاده شده است .در صورت نياز به هر نوع تغييردر توصيف عناصر ID وGPA کافی است تغيير مورد نظر را صرفا” در يک محل ( محلی که توصيف آنان انجام شده است ) اعمال نمود . بدين ترتيب ، تمام سند  و در هر مکانی که از عناصر فوق استفاده شده است ، متاثر از تغيير ايجاد شده بصورت اتوماتيک می گردد .
روش های فوق ، در خصوص انواع داده ساده (Simpletype) نيز صادق است . همانگونه که در بخش سوم اين مقاله اشاره گرديد ،  تعريف يک عنصر ساده (Simpletype) را  میتوان بصورت داخلی (Nested) و يا بصورت زير مجموعه ای از عنصر ريشه (Schema) ،  انجام داد. در حالت دوم ، امکان استفاده مجدد از  تعريف انجام شده وجود  داشته و می توان از آن در هر مکانی از توصيف جاری و يا حتی توصيفهای ديگر استفاده نمود. مثال ارائه شده در بخش سوم اين مقاله ، نحوه اعمال محدوديت بر روی يک  نوع داده استاندارد نظير  String و ايجاد نوع داده جديدی با نام StudentGpa  را نشان می دهد . مثال فوق ، در اين راستا می تواند مفيد واقع شود .

دسترسي به ساير توصيف ها
همانگونه که اشاره گرديد، عناصر و انواع داده ئی که بعنوان عنصر زير مجموعه ريشه Schema در يک توصيف  قرار می گيرند ، امکان استفاده مجدد از آنان در ساير توصيف ها وجود خواهد داشت . بدين منظور و در اولين مرحله می بايست از  Import  و يا Include استفاده گردد مثال زير ، نحوه استفاده از Include را نشان می دهد .

مثال : نحوه و جايگاه استفاده از Include

<?XML Version = “1.0”?>
<XSD:Schema Xmlns:XSD=”http://www.w3.org/2001/xmlschema”
TargetNameSpace=”URI goes here”>
<XSD:Include Schemalocation=”XSDfilename goes here”/>
.
.
.
</XSD:Schema>

از گرامر فوق ، زمانی استفاده می شود که توصيف جاری و يا بعبارت ديگر Targetnamespace و توصيفی که می خواهيم از عناصر و يا انواع داده آن استفاده نمائيم ، در يک موقعيت فيزيکی  و يا Location قرار داشته باشند . به مثال ذيل توجه فرمائيد :

مثال : نحوه استفاده از Include

<?XML Version = “1.0”?>
<XSD:Schema Xmlns:XSD=”http://www.w3.org/2001/xmlschema”
TargetNameSpace=”http://www.srco.ir/students”>
<XSD:Include Schemalocation=”StudentGpa1.xsd”/>
<XSD:Element Name=”teacher”  Minoccurs=”0″  MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Sequence>
<XSD:Element Ref = “StudentGPA” Minoccurs=”1″  MaxOccurs=”1″ />
<XSD:Element Name=”University” Type=”XSD:String” />
</XSD:Sequence>
</XSD:Complextype>
</XSD:Element>
</XSD:Schema>

در مثال فوق ، موقعيت فيزيکی توصيف جاری و توصيفی که می خواهيم از آن استفاده نمائيم (StudentGpa1.xsd) يکسان است . در تشريح عنصر Teacher ، از تعريف StudentGpa که در سند StudentGpa1.xsd توصيف شده است، استفاده گرديده است .
در صورتيکه موقعيت فيزيکی سند جاری و يا Targetnamespace و سندی که می خواهيم از تعاريف آن استفاده نمائيم يکسان نباشد ، می بايست از گرامر ذيل استفاده گردد :

مثال : نحوه و جايگاه استفاده از Import

<?XML Version = “1.0”?>
<XSD:Schema Xmlns:XSD=”http://www.w3.org/2001/xmlschema”
TargetNameSpace=”URI goes here”>
<XSD:Import Namespace=”URI goes here”
Schemalocation = “XSD filename goes here”/>
.
.
.
</XSD:Schema>

فرض کنيد در مثال قبل ، موقعيت فيزيکی سند جاری و يا Targetnamespace و سندی که تعريف studentgpa در آن توصيف شده است يکسان نباشد ، در چنين مواردی می توان از Import استفاده و توصيف سند مورد نظر را بصورت زير انجام داد :

مثال : نحوه استفاده از Import

<?XML Version = “1.0”?>
<XSD:Schema Xmlns:XSD=”http://www.w3.org/2001/xmlschema”
TargetNameSpace=”http://www.srco.ir/Teachers”>
<XSD:Import Namespace = “http://www.srco.ir/students”
Schemalocation=”StudentGpa1.xsd”/>
<XSD:Element Name=”teacher”  Minoccurs=”0″  MaxOccurs=”Unbounded”>
<XSD:ComplexType>
<XSD:Sequence>
<XSD:Element Name = “TeacherGPA” Type = “StudentGpa1:StudentGpa”
Minoccurs=”1″  MaxOccurs=”1″ />
<XSD:Element Name=”University” Type=”XSD:String” />
</XSD:Sequence>
</XSD:Complextype>
</XSD:Element>
</XSD:Schema>

همانگونه که مشاهده می گردد ، موقعيت فيزيکی  سند جاری  و سندی که از آن استفاده شده است ، يکسان نمی باشد (به نحوه استفاده از تعريف عنصر studentGpa توجه نمائيد ) .
در بخش ششم اين مقاله ، به بررسی انواع داده در XSD  و نحوه مستند سازی اسناد مربوطه ، خواهيم پرداخت .


XSD چيست ؟( بخش ششم)
آنچه تاکنون گفته شده است :
بخش اول :  مقاهيم و جايگاه نکنولوژی XSD
بخش دوم :  گرامر XSD
بخش سوم :انواع داده ( ساده ، مرکب )
بخش چهارم : بررسی Attribute
بخش پنجم : تشريح يک عنصر در سند XSD
در اين بخش به بررسی  انواع داده در XSD  ، خواهيم پرداخت .
تعيين نوع داده  يکی از ويژگی های مهم XSD بوده  که با استفاده از آن ميتوان عناصر و يا خصلت ها را با فرمت صحيح و دلخواه اعتبار سنجی نمود . تکنولوژی  XSD ، دامنه گسترده و وسيعی از  انواع داده را حمايت و در عين حال  به کاربر امکان تعريف نوع داده دلخواه را نيز خواهد داد .

انواع داده ساده يا استاندارد
تکنولوژی XSD ، يش از چهل و چهار نوع نوع داده ساده يا استاندارد را حمايت که  بسياری از آنان بصورت از پيش تعريف شده در XSD تعبيه  و برخی ديگر نيز از تعاريف فوق ، مشتق شده اند . بدين ترتيب کاربران بسادگی  قادر به استفاده از آنان  در توصيف عناصر و يا خصلت های اسناد مورد نظر خود خواهند بود  .
جدول زير ، نحوه تعريف نوع داده يک عنصر را نشان می دهد ( در بخش های قبل مقالات از آن استفاده شده است ) .

تعريف يک نوع داده در XSD

     .
.
.
<XSD:Element Name=”ID”      Type=”XSD:String” MinOccurs=”1″ MaxOccurs=”1″/>
.
.
.

 جدول زير ، انواع داده مهم حمايت شده در XSD  را نشان می دهد .

انواع داده حمايت شده در XSD

نوع داده

توضيحات و مثال

anyuri

Uniform Resource Locator
Example : http://www.srco.ir

base64Binary

MIME STYLE base64 encoded binary data

hexBinary

Hexadecimal encoded binary data

boolean

TRUE(1) Or FALSE(0)

byte

Numbers between -128 To 127

dateTime

Date in a subset of  the ISO8601 format
Time and Timezone are optional
Example: 2003-04-15T10:40:15.000-05:00

date

Date in a subset of the ISO8601 format
Example: 2003-04-15

decimal

Positive or negative arbitrary precision decimal value
Examples: -5.34,0,5.34,5000.00

double

double precision 64-bit floating point

duration

Duration of time specified in years , months , days , hours , minutes and seconds format , as defined in the ISO8601 standards extended format PnYnMnDTnHnMnS.nY is then number of years , nM is the number of months and so on .The P is required but the other items are optional
Example:To specify duration of one year and two months you would specify : P1Y2M

float

Single precision 32-bit floating point

gDay

Day in Gregorian format
Example: –31 every 31th day,regardless of month

gMonth

Month in Gregorian format
Example: –06– every may

gMonthDay

Month and day in Gregorian format
Example: –07-31 every july 31th

gYear

Year in Gregorian format
Example: 2000

gYearMonth

Year and month in Gregorian format
Example:2000-02

Int

Integer.Sign is optional
Range: -2147483648 to 2147483647

Integer

The standard mathematical concept of integer numbers
Range: An infinite set of negative or positive numbers

Language

Any valid XML language value as defined by RFC 1766
Example: en-US

Long

Integer
Range: -9223372036854775808 to
9223372036854775807

Name

XML 1.0 name type

NCName

XML namespace ncname (An XML name without the prefix and colon)

negativeInteger

Range : Negative infinity to -1

nonNegativeInteger

Range : 0 to infinity

positiveInteger

Range : 1 to infinity

nonPositiveInteger

Range : Negative infinity to 0

normalizedString

String of character data. Newline,tab and carriage-return characters are converted to spaces before schema processing.

Short

Range : -32768 to 32767

String

String of character data .(characters that match CHAR from XML 1.0)

Time

Time in hh:mm:ss.sss-TimeZone format . Time zone is optional . The time zone is based on the number of hours ahead or behind coordinated universal time (as define in ISO8601)
Example : 11:45:33.20-05:00 where 05:00 means 5 hours behind universal time .

Token

string of character data . Like normalizedstring the newline,tab and carriage-return characters are converted to spaces before schema processing . In addition , adjacent space characters are collapsed to a single space and leading and trailing spaces are removed .

unsignedByte

Unsigned byte .
Range : 0 to 255

unsignedInt

Unsigned integer .
Range : 0 to 4294967295

unsignedlong

Unsigned long integer .
Range : 0 to 18446744073709551615

unsignedShort

Unsigned short integer.
Range : 0 to 65535

QName

XML namespace QName.

NOTATION

XML 1.0 NOTATION attribute type. to retain compatibility between XSD and XML DTD 1.0s. these should only be used with attributes.

NMTOKEN

Name token value. string consisting of one word in a set of letters , digits and other characters in any combination .to retain compatibility between XSD and XML DTD 1.0s. these should only be used with attributes.

NMTOKENS

List of name tokens separated by whitespace. to retain compatibility between XSD and XML DTD 1.0s. these should only be used with attributes.

ID

The ID value must be unique throughtout all elements in the XML document. This attribute is refrenced by other attributes such as idref and idrefs. to retain compatibility between XSD and XML DTD 1.0s. these should only be used with attributes.

IDREF

References the value in an ID attribute within the XML document. to retain compatibility between XSD and XML DTD 1.0s. these should only be used with attributes.

IDREFS

References multiple ID type values separated by whitespace. to retain compatibility between XSD and XML DTD 1.0s. these should only be used with attributes.

ENTITY

XML 1.0 ENTITY attribute type. to retain compatibility between XSD and XML DTD 1.0s. these should only be used with attributes.

ENTITIES

XML 1.0 ENTITIES attribute type. ENTITIES contain a set of ENTITY values.  to retain compatibility between XSD and XML DTD 1.0s. these should only be used with attributes.


ايجاد انواع داده دلخواه
همانگونه که در بخش های قبل اين مقاله اشاره گرديد ، ، در  XSD  اين امکان وجود خواهد داشت  که کاربر با استفاده از انواع داده استاندارد (جدول فوق) و اعمال محدوديت های دلخواه بر روی آنان  ، اقدام به تعريف انواع داده ساده (Simple) دلخواه خود نموده و از آنها در توصيف جاری و يا حتی ساير توصيف ها استفاده نمايد .
با توجه به اينکه نحوه تعريف انواع داده دلخواه در مقالات قبل به تفصيل بيان شده است ، در اين بخش از مقاله ، از تکرار آن خودداری نموده و صرفا” به تشريح حالات مختلف خلاصه سازی يا محدود سازی اشاره خواهد شد .

پارمترهای محدود سازي (Facets)
خلاصه سازی و يا محدود سازی بستگی مستقيم به نوع داده پايه ای دارد که ميخواهيم محدود سازی را بر روی آن اعمال نمائيم . در خصوص داده هائی از نوع رشته‏ ای، پارمترهای مختلف محدود سازی به شرح ذيل می باشند :

  • enumeration
  • length
  • minlength
  • maxlength
  • pattern
  • whitespace

جدول زير نحوه استفاده از پارامتر الگو(pattern) و اعمال  کنترل های مختلف بمنظور تشريح  الگو را نشان می دهد :

Regular Expression

Explanation

Example(s)

\d

Digit

1,2,3, etc.

[a-z]

Lower case ASCII characters

a,b,c, etc.

[A-Z]

Upper case ASCII characters

A,B,C, etc.

*

Wildcard

A*Z=ABZ,AbnmZ,ADDFZ, etc.

?

Single placeholder

A?Z=ABZ,AbZ,ACZ, etc.

+

Inclusive of at least the specified values, but more are allowed .

A+Z=AZ,ABZ,ABCZ, etc.

(Value1|Value2)

Or

(A|Z)+Q=AQ,ZQ,ABQ,ZBQ, etc.

[abcde]

Another way to specify or , but with single character only.

[abc]=a,b, or c

[^0-9]

Any non-digit character

A,B,C,a,b,c, etc.

{integer}

The number of occurrences that there must be of the previous value .

az{2} = azz
\d{3} = 123,456,789,444, etc.
(az){2} = azaz

مثال يک : در مثال زير نحوه استفاده از پارامتر الگو ، نشان داده شده است :

مثال  يک : نحوه استفاده از پارامتر الگو

<XSD:simpleType name=”StudentGPA”   minOccurs=”1″   maxOccurs=”1″>
<XSD:restriction   base=”XSD:string”>
<XSD:length  value=”4″ />
<XSD:pattern value=”/d{1} . /d{2}” />
</XSD:restriction>
</XSD:simpleType>

مثال دوم : در مثال زير نحوه استفاده از پارامتر الگو ، نشان داده شده است :

مثال  دو : نحوه استفاده از پارامتر الگو

<XSD:simpleType name=”StudentGPA”   minOccurs=”1″   maxOccurs=”1″>
<XSD:restriction   base=”XSD:string”>
<XSD:enumeration Value = “2.0” />
<XSD:enumeration Value = “2.5” />
<XSD:enumeration Value = “3.0” />
<XSD:enumeration Value = “3.5” />
<XSD:enumeration Value = “4.0” />
</XSD:restriction>
</XSD:simpleType>

نکته : در مثال دوم، ارزش های مختلفی  که يک سند براي عنصر StudentGPA می تواند داشته باشد 2.0 يا 2.5 يا 3.0 يا 3.5 يا 4.0 است . اما در مثال اول طول رشته بايد چهار حرف بوده و الگوی آن نيز معادل الگوی تعريف شده در pattern باشد . حال سئوال اينجا است که در محدود سازی يک نوع داده ، جايگاه واقعی استفاده از  and و يا or چگونه است ؟. جواب اين سئوال پيچيده نيست ، در واقع ، در موارديکه از خصلت های enumoration و pattern استفاده می گردد ، واقعيت or حکمفرما بوده  و  در صورت استفاده از ساير خصلت ها ، واقعيت and حکم فرما خواهد بود.

در خصوص داده های عددی ، پارامترهای محدود سازی(Facets) به شرح ذيل می باشد :

  • enumeration
  • fractionDigits
  • maxExclusive
  • minExclusive
  • maxInclusive
  • minInclusive
  • pattern
  • totalDigits
  • whiteSpace

مثال : در مثال زير نحوه استفاده از پارامترهای محدودسازی در خصوص داده های عددی را نشان می دهد :

مثال : نحوه استفاده از پارامترهای محدودسازی در خصوص داده های عددی

<XSD:simpleType name=”courseNumber”   minOccurs=”0″   maxOccurs=”10″>
<XSD:restriction   base=”XSD:integer”>
<XSD:minInclusive  value=”1000″ />
<XSD:maxInclusive value=”3000″ />
</XSD:restriction>
</XSD:simpleType>

در اين مثال نوع داده دلخواهی جهت توصيف عنصر شماره درس ايجاد شده است که طبق آن هر دانشجو ميتواند تا 10 درس را ثبت نام نموده و شماره هر درس نيز بين 1000 تا 3000 بايد باشد . بنابر اين در صورتيکه در يک سند XML  که از توصيف فوق استفاده نموده وعنصر course دارای مقدار 4000 و بصورت زير باشد،پارسر XSD خطائی مبنی بر ايجاد مشکل در نوع داده ارائه و سند اعتبار سنجی نخواهد شد .

<course>4000</course>

در بخش هفتم اين مقاله به بررسی  مستند سازی يک توصيف يا سند XSD  خواهيم پرداخت .


نظر خود را بگذارید

-- بارگیری کد امنیتی --