در زمانهای گذشته و قبل از به وجود آمدن پایگاههای داده، اطلاعات روی فایلها ذخیره میشدند. در هر فایل ممکن بود دادههای گوناگون با انواع مختلف در کنار هم قرار گیرند. البته باید به طریقی این دادهها از یکدیگر تفکیک و جدا میشدند. بنابراین برای هر برنامه، یک کاراکتر جدا کننده یا ترکیبی از کاراکترها به طور قراردادی، برای ذخیره و بازیابی دادههای روی فایل تعریف شد که از جمله پرکاربردترین آنها کاراکتر کاما، نقطه و Space بود.
در این دوره مشکلاتی وجود داشت که از میان آنها میتوان به برخی از موارد زیر اشاره کرد:
• جداسازی دادهها با استفاده از کاراکترها چندان مناسب نبود و میتوانست در بازیابی آنها اشکال ایجاد کند، زیرا بسیار پیش میآمد که کاراکترهای جداساز خود جزو دادهها بودند.
• اگر شخصی فایل حاوی دادهها را باز میکرد، نمیتوانست با مشاهده فایل تشخیص دهد که هر مقدار مربوط به کدام فیلد است و همچنین چیدمان اطلاعات در داخل فایل بسیار نامنظم بود.
• مهمترین مسئله این بود که فایل ساخته شده توسط یک برنامه کاملا به همان نرمافزار وابسته بود و نرمافزار دیگری نمیتوانست از اطلاعات آن فایل استفاده کند.
این مشکلات با گذشت زمان و با پیشرفت علم حل شد. حال به نظر شما برای رفع این مشکلات چه راههایی اتخاذ شد؟ پاسخ فناوری XML است که با تولد خود راه جدیدی را پیش روی برنامهنویسان گشود.
XML چیست؟
XML استاندارد و روش ساختیافتهای است که کنسرسیوم وب برای نگهداری اطلاعات به صورت رشتهای و در تگها و دستهبندیهای دلخواه ارایه کرده است و امروزه جایگاه ویژهای در دنیای برنامهنویسی به خود اختصاص داده است. امروزه XML از ملزومات کاری یک برنامهنویس به شمار میرود. XML نقش بسیار مهمی در عصر فناوری اطلاعات ایفا میکند و هر روز بر طرفداران آن افزوده میشود.
در این مقاله قصد داریم به ابزارها و کلاسهایی که در داتنت برای کار با XML در اختیار برنامهنویسان قرار داده شده، صحبت کنیم و علت پیدایش و ماهیت و ساختار آن را برای شما شرح دهیم. همچنین شما را با نحوه برنامهنویسی و تولید یا خواندن فایل XML در سیشارپ نیز آشنا خواهیم کرد.
پیدایش XML
زمانی که اینترنت هنوز یک فناوری جوان و نوپا بود و از آن برای به اشتراک گذاشتن مقالات بین شرکتهای بزرگ استفاده میشد، آزمایشگاهی به نام "سرن (Cern)" در اروپا وجود داشت که در آن تحقیقات فیزیکی انجام میگرفت. این آزمایشگاه روزانه مقالات زیادی را از دستاوردهای جدید خود روی اینترنت قرار میداد. بعد از مدتی برای بهبود مقالات و رفاه بیشتر خوانندگان، به این فکر افتادند تا مقالات را به گونهای بنویسند که خواننده بتواند در مورد برخی اصطلاحات و یا اسامی افراد متخصص که در مقالات وجود داشت، با کلیک روی آن کلمه به صفحهای دیگر منتقل شده و در آن صفحه راجع به آن مطلب یا شخص بیشتر مطالعه کند. از این جا بود که ایده صفحات هوشمند به وجود آمد. البته قضیه به همین جا ختم نشد و آزمایشگاه مذکور تصمیم گرفت تا با تغییر در رنگ و فونت برخی از بخشها، مقالات را برای خوانندگان جذابتر کند. این بود که به این نتیجه رسیدند در مقالات خود علامتهایی قرار دهند که هر یک کار خاصی انجام میداد و در هنگام نمایش متن مقاله، هنگامی که برنامه مرورگر به این علامتها بر میخورد، آنها را نمایش نمیداد و در ازای آن تغییری در متن با توجه به ویژگی آن علامت میداد. بدین ترتیب علامتها از دید خوانندگان پنهان بود ولی برنامههای مرورگر بعد از آن طوری طراحی شدند که قابلیت خواندن آن علایم را داشتند و متناسب با هر کدام فرمت متن را تغییر میدادند. این علامتها را تگ نامیدند و تمامی تگها در داخل دو علامت <> قرار میگرفتند.
تگ داخل خود متن و در مکانهایی که به آن نیاز بود، میآمد و هر تگ وظیفه خاصی داشت. به طور مثال تگ
باعث میشد تا متن بعد از آن در سطر بعدی نمایش داده شود و تگ که مهمترین تگ به شمار میرود، باعث میشود تا متن بعد از آن به صورت یک HyperLink نمایش داده شود و خواننده با کلیک روی آن به بخش دیگری از صفحه و یا به صفحه دیگری هدایت شود.
تگها روی هم زبان HTML را تشکیل دادند و پیدایش این زبان از این جا بود.
با گذشت زمان و استفاده از قالببندی متنها کم کم متخصصین امر به این نتیجه رسیدند که علاوه بر متن، دادهها را نیز میتوان برای استفاده بهتر قالببندی کرد. این بود که پای زبانهای قالببندی به دنیای دادهها نیز باز شد و به مرور زمان دادهها و اطلاعات نیز توسط تگها قالببندی شدند، با این تفاوت که تگها در زبان HTML از قبل تعریف شده و مشخص بودند ولی تگها در دنیای دادهها نامشخص بودند و هر فرد میتوانست دادههای خود را بنا به سلیقه و با تگهایی که خودش تعریف کرده دستهبندی نماید.
بدین ترتیب زبان XML که برگرفته از زبان HTML بود، متولد شد و بسیاری از مشخصات خود را نیز از آن به ارث برد. در همین زمان بود که کنسرسیومی به نام "W3C" به وجود آمد و زبان HTML و XML را استانداردسازی و قوانینی را برای استفاده از آنها وضع کرد. زبان HTML نقصهای زیادی داشت و ساختار مشخصی نداشت و با وجود آنکه زبان XML بعد از آن پدید آمده بود، بسیار پیشرفتهتر بود. از این رو کنسرسیوم W3C که بعدها به کنسرسیوم وب معروف شد، این نقصها را برطرف کرد و برخی از قوانین XML را برای زیبایی و نظم در آن گنجاند و در کل زبان جدیدی به وجود آمد که به دلیل اینکه تلفیقی از دو زبان XML و HTML بود، XHTML نام گرفت. XHTML زبانی برای قالببندی متون و با مشخصات و قوانین XML بود.
برخی قوانین و اصطلاحات
همانطور که گفته شد، به علامتهایی که برای قالببندی به وجود آمدند تگ میگویند که البته آنها را Node یا Element یعنی عنصر نیز مینامند.
تگها حتما باید دو علامت <> را در دو طرف خود داشته باشند:
. هر تگ باید یک تگ پایانی نیز داشته باشد که نشاندهنده پایان تگ است. به تگ آغازین "Openning Tag" و به تگ پایانی "Closing Tag" میگویند. تگ پایانی همنام با تگ آغازی است با این تفاوت که یک علامت "/" در ابتدای خود دارد:
.
به محتویاتی که در بین تگ آغازی و تگ پایانی قرار میگیرد "Content" (محتوا) گفته میشود:
بعدها بنا به ضرورت بخشهایی به نام خصیصه (Attribute) به داخل بدنه تگها افزوده شد که رفتار هر تگ را توصیف میکرد. هر خصیصه میتواند یک مقدار بپذیرد و مقدار خصیصه باید داخل دو علامت "" قرار بگیرد: .
هر تگ میتواند خود شامل چندین تگ داخلی دیگر باشد که در این حالت به تگ اصلی، تگ والد (Parent) و به تگهای داخل آن تگهای فرزند (Child) گفته میشود.
تمامی تگهای یک فایل XML باید داخل یک تگ کلی به نام تگ ریشه "Root" قرار بگیرند.
مثال کاربردی از XML
برای درک بهتر چگونگی قالببندی فایلهای حاوی اطلاعات، با استفاده از فناوری XML، به یک مثال
عملی میپردازیم:
فرض کنید میخواهیم شماره تلفن دوستان خود را در یک فایل ذخیره کنیم تا در صورت لزوم شماره آنها
در دسترس باشد. بنابراین ابتدا تگهایی را برای طبقهبندی اطلاعات خود تعریف میکنیم. همانطور که گفته شد تعریف تگها و نامگذاری آنها کاملا سلیقهای است. در این مثال تگی با عنوان "" در نظر میگیریم که در برگیرنده اطلاعات کلیه دوستان است. داخل این تگ تگهایی با نام "" قرار میگیرند که هر کدام از آنها مربوط به یکی از دوستان ما هستند. این تگ یک خصیصه به نام "name" دارد که نام هر شخص را مشخص میکند. داخل هر تگ نیز تگی به نام "" تعریف میکنیم که داخل آنها شماره تلفن شخص قرار داده میشود. بنابراین ساختار فایل ما شبیه شکل 1 خواهد شد:
شکل 1
ساختار XML
XML مخفف عبارت Markup Language Extensibale به مفهوم "زبان علامتگذاری قابل توسعه" است.
همانطور که از نام این فناوری پیداست، XML یک پدیده قابل بسط و بدون حد و مرز است و به همین دلیل میتواند باعث بروز مشکلات فراوانی شود زیرا هر شخص بنا به نظر و سلیقه شخصی خود میتواند تگهای دلخواه به وجود آورد و این امر باعث ایجاد هرج و مرج در دنیای XML میشود. به همین دلیل و برای حل این مشکل، کنسرسیوم وب قانونی وضع کرد که براساس آن هر شخص موظف است قبل از ایجاد فایل XML خود، فرمت و قالب کلی آن را توصیف کند تا برنامه براساس آن قالب بتواند روی فایل مذکور نظارت داشته باشد و قوانین کنسرسیوم وب را روی آن اعمال نماید. این توصیف در فایلی تحت عنوان فایل Definition میآید. کنسرسیوم وب برای این فایلها نام DTD را در نظر گرفت و در آن استانداردی ایجاد شد که توسط علامتهایی ساختار فایل XML تعریف میشد. بعدها با نظر اعضای کنسرسیوم شیوه تعریف به همان زبان XML تغییر یافت و استانداردی به نام(XSD (XML Schema Definition به وجود آمد که طبق آن توسط زبان XML یک فایل XML را توصیف میکنند (مانند شکل 1).
در استاندارد XSD تگهای از قبل تعریف شده کنسرسیوم وب وجود دارد که توسط آنها میتوان یک فایل XML را توصیف کرد.
برای ایجاد فایل XSD برای فایل XML راه آسان و مناسب این است که ابتدا در ویژوال استودیو به کمک Add New Item یک Xml File به پروژه اضافه کرده و کلیه تگهای مورد نیاز خود را در آن قرار دهیم. پس از ساختن فایل XML از منوی "Xml" در ویژوال استودیو گزینه "Create Schema" را انتخاب میکنیم. در این حالت ویژوال استودیو خود فایل XSD مربوط به فایل XML ما را تولید میکند.
اشتباه برنامهنویسان
باید به این نکته توجه داشت که زبان XML و فرزندان آن همانند جدشان HTML همگی نوعی زبان قالببندی هستند و نمیتوان هیچ کدام از آنها را در رده زبانهای برنامهنویسی مانند جاوا، سیشارپ و ... قرار داد. زبانهای برنامهنویسی همگی ماهیت اجرایی دارند و قابل تبدیل به کدهای سیستمی و زبان قابل اجرا برای کامپیوتر هستند ولی زبانهای نسل XML ماهیت قالببندی دارند و قابل اجرا نیستند و نمیتوان آنها را با زبانهای برنامهنویسی مقایسه کرد. اغلب افراد به اشتباه زبانهای نسل XML را نیز همانند زبانهای برنامهنویسی میدانند، حال آنکه باید بین این دو نوع زبان تفاوت قائل شد. گرچه بعدها با گنجاندن اسکریپتها در HTML به آن قابلیت اجرایی نیز اضافه شد، اما باید دقت داشت در هنگام انجام یک عمل در HTML باز هم زبان برنامهنویسی اجرای عملیات مورد نظر را به عهده دارد نه خود HTML.
XML و C Sharp
حال نوبت به آن میرسد که به سراغ داتنت رفته و برنامهنویسی XML را در آن بیاموزیم.
همانطور که میدانید تمامی کلاسها و انواع دیگر موجود در داتنت برای مرتبسازی و دسترسی
آسانتر، بر حسب وظایف و کاربردشان به بخشهایی به نام Name Space (فضای نام) تقسیمبندی شدهاند و برای هر عمل خاص باید به فضای نام مربوط به همان مراجعه کرده و از کلاسهای موجود آن استفاده کرد.
برای کار با XML نیز در داتنت فضای نامی با عنوان System.XML"" وجود دارد که در آن کلیه کلاسها و ملزومات برای کار با XML در اختیار برنامهنویس قرار داده شده است.
مهمترین کلاسی که در این فضای نام برای این منظور طراحی شده است، کلاس "XmlDocument" است که شامل اعضای زیادی هم برای ایجاد فایل XML و هم برای خواندن از روی فایل XML بوده و برای هر دو عمل به طور مشترک از همین کلاس استفاده میشود. نکتهای که در این جا باید به آن اشاره شود این است که دقت داشته باشید کار با XML اعم از ایجاد و یا خواندن عناصر آن همگی در داتنت به صورت CaseSensitive است یعنی اگر در تایپ حروف کوچک و بزرگ دقت لازم را نداشته باشید، ممکن است در اجرای برنامه به نتیجه دلخواه دست پیدا نکنید. بنابراین توصیه میشود برای جلوگیری از هرگونه اشتباه احتمالی در تمامی مراحل کار، اسامی عناصر XML آنها را همگی با حروف کوچک بنویسید.
برای شروع، قبل از هر چیز باید یک فایل XML را در برنامه بارگذاری کنیم تا بتوانیم از داخل آن اطلاعات را خوانده و یا روی آن بنویسیم. برای این منظور از متدی به نام "Load()" استفاده میکنیم که از اعضای کلاس XmlDocument است و به عنوان ورودی، آدرس فیزیکی فایل مورد نظر را گرفته و آن را برای کار باز و مهیا میکند. اگر بخواهیم فایل جدیدی روی هارددیسک ایجاد کنیم، هم میتوان آن را با دستورات سیستم عامل به وجود آورد و هم میتوان توسط برنامه ایجاد کرد. توضیح روش آن به وسیله کد از حوصله این مقاله خارج است. لازم به ذکر است که فایل XML یک فایل متنی با پسوند ".xml" است. همچنین میتوانید در ویژوال استودیو توسط پنجره "Add New Item" به پروژه خود یک "Xml File" اضافه کنید. اگر از این روش استفاده کنید، در ابتدای فایل XML ایجاد شده یک تگ عجیب و غریب وجود خواهد داشت که به آن "Meta Tag" میگویند و به دلیل اینکه فایل XML تولید شده توسط ویژوال استودیو از فایل XSD کنسرسیوم وب تبعیت میکند، این تگ به خودی خود در فایل وجود خواهد داشت.
وقتی فایل XML بارگذاری شد، توسط اعضای کلاس XmlDocument میتوان داخل آن با فرمت XML نوشت و یا دادهها را از آن استخراج کرد.
در این کلاس یک خصیصه (Property) به نام "FirstChild" که یک نمونه از کلاس "XmlNode" است وجود دارد که به اولین تگ موجود در فایل و کلیه زیرشاخههای آن اشاره میکند. حال اگر فایل شما متاتگ داشته باشد، این خصیصه به آن اشاره کرده و در غیر این صورت به اولین تگ موجود اشاره خواهد داشت. همچنین خصیصهای نیز با نام "LastChild" وجود دارد که به آخرین تگ فایل اشاره میکند. حال اگر فایل مورد نظر ما استاندارد کنسرسیوم وب را رعایت کرده باشد و شامل یک تگ ریشه باشد و متاتگ نیز داشته باشد، این خصیصه به تگ ریشه که شامل همه تگهای فایل است اشاره خواهد کرد.
خصیصه "ChildNodes" نیز یکی دیگر از خصیصههای این کلاس است که از نوع کلاس "XmlNodeList" بوده و شامل کلیه تگهای فرزند تگی است که به آن داده میشود.
کلاس "XmlElement" یک کلاس در داتنت است که معادل یک تگ بوده و برای دسترسی به یک تگ از این کلاس استفاده میشود. کلاسی نیز با نام "XmlAttribute" در داتنت تعریف شده که به خصیصههای یک تک اشاره دارد. کلاسهای "XmlElement" و "XmlAttribute" هر دو از کلاس پایهای به نام "XmlNode" ارث میبرند. همچنین کلاس "XmlElement" اعضای زیادی برای کار با تگها دارد و از آن جمله میتوان به خصیصه "Attributes" اشاره کرد که شامل کلیه خصیصههای یک تگ است.
برای ایجاد هر یک از عناصر XML از متدهای مختلفی که در کلاس "XmlDocument" تعریف شدهاند و همگی با کلمه "Create" آغاز میشوند، استفاده میکنیم. به طور مثال برای ایجاد یک تگ از متد "CreateElement" و برای ایجاد یک خصیصه از متد "CreateAttribute" استفاده مینماییم.
اگر در فایل XML تغییری داده باشیم و یا محتویاتی به آن اضافه کرده باشیم، توسط متد "Save()" از کلاس "XmlDocument" میتوانیم آن تغییرات را ذخیره کنیم.
طرح مثال
تا این جا شما را با برخی از کلاسهای مهم کار با XML و برخی اعضای آنها آشنا کردیم. در پایان با ذکر مثالهایی از موارد ذکر شده، شما را با طریقه کارکرد برخی از آنها نیز آشنا میکنیم.
در مثال اول، اطلاعات از یک فایل XML خوانده میشود که شامل یک ریشه با نام "Albums" و فرزندانی با نام "Person" است. داخل تگهای Person تگی با نام "Images" وجود دارد که فرزندان این تگ "Photo" نامگذاری شدهاند و داخل آنها آدرس فیزیکی یک عکس روی هارددیسک قرار میگیرد. قابل ذکر است که در این مثال کلاسهای "Person" و "Photo" توسط برنامهنویس تعریف شدهاند (شکل 2).
شکل 2
در مثال دوم نیز در یک فایل XML تگهایی به وجود میآوریم که برخی از آنها شامل خصیصه هستند و داخل بعضی نیز مقادیری به عنوان محتوا قرار میدهیم. در این مثال ساختار فایل XML همان ساختار نگهداری شماره تلفن دوستان است. مقادیر از TextBoxهایی که داخل فرم وجود دارند خوانده شده و داخل فایل قرار میگیرند (شکل 3).
شکل3