.
چرا به 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 خواهیم پرداخت .
________________________________________
خیلی ممنون عالی بود