نوشتن در یک فایل XML

با استفاده از متدها و کلاس‌های XML Document Object Model، می‌توان به راحتی یک سند XML ایجاد و آن را در یک فایل ذخیره کرد. در این درس می‌خواهیم نحوه نوشتن در یک فایل XML را با استفاده از یک برنامه به شما آموزش دهیم. این برنامه به کاربر اجازه ثبت سن، جنس و نامش و ذخیره آنها در یک فایل XML را می‌دهد. یک برنامه ویندوزی جدید به شکل زیر ایجاد کنید :
writing-xml-1001
نام کنترل‌های textBox را به textBoxName، textBoxAge و textBoxGender و نام دکمه را به buttonAdd تغییر دهید. سپس یک فایل XML به نام sample.xml به صورت زیر ایجاد و آن را در درایو C ذخیره کنید :

write-in-xml-file-c#-01

write-in-xml-file-c#-02
حال نوبت به بخش کدنویسی می‌رسد. با زدن دکمه F7 به محیط کدنویسی رفته و فضای نام System.Xml را به قسمت فضاهای نامی اضافه کنید.

using System.Xml;

حال یک فیلد XmlDocument و یک رشته برای نمایش مسیر فایل XML اضافه می‌کنیم.

private XmlDocument doc;
private const string PATH = @"C:\sample.xml";

به محیط طراحی بر می‌گردیم و بر روی دکمه دوبار کلیک می‌کنیم تا کنترل کننده رویداد مربوط به رویداد کلیک ایجاد شود :

private void buttonAdd_Click(object sender, EventArgs e)
{
    //  ایجاد می‌کنیم XML یک سند
    doc = new XmlDocument();

    // اگر فایل XML در مسیر مشخص شده وجود نداشت آن را ایجاد می‌کنیم
    if (!System.IO.File.Exists(PATH))
    {
        //گره‌های لازم را ایجاد می‌کنیم
        XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
        XmlComment comment = doc.CreateComment("This is an XML Generated File");
        XmlElement root = doc.CreateElement("Persons");
        XmlElement person = doc.CreateElement("Person");
        XmlAttribute name = doc.CreateAttribute("name");
        XmlElement age = doc.CreateElement("Age");
        XmlElement gender = doc.CreateElement("Gender");

        //مقادیر را به گره‌ها اضافه می‌کنیم
        name.Value = textBoxName.Text;
        age.InnerText = textBoxAge.Text;
        gender.InnerText = textBoxGender.Text;

        //سند را ایجاد می‌کنیم
        doc.AppendChild(declaration);
        doc.AppendChild(comment);
        doc.AppendChild(root);
        root.AppendChild(person);
        person.Attributes.Append(name);
        person.AppendChild(age);
        person.AppendChild(gender);

        doc.Save(PATH);
    }
    else //اگر فایل XML از قبل موجود بود
    {
        //را بارگذاری می‌کنیم XML فایل 
        doc.Load(PATH);

        //عنصر ریشه را بدست می‌آوریم
        XmlElement root = doc.DocumentElement;

        XmlElement person = doc.CreateElement("Person");
        XmlAttribute name = doc.CreateAttribute("name");
        XmlElement age = doc.CreateElement("Age");
        XmlElement gender = doc.CreateElement("Gender");

        //مقادیر را به گره‌ها اضافه می‌کنیم
        name.Value = textBoxName.Text;
        age.InnerText = textBoxAge.Text;
        gender.InnerText = textBoxGender.Text;

        //را ایجاد می‌کنیم Person عنصر 
        person.Attributes.Append(name);
        person.AppendChild(age);
        person.AppendChild(gender);

        //  را به آخر عنصر ریشه اضافه می‌کنیم Person عنصر 
        root.AppendChild(person);

        //Save the document
        doc.Save(PATH);
    }

    //نمایش پیغام موفقیت آمیز
    MessageBox.Show("Details have been added to the XML File.");

    //پاک کردن فیلدها برای ورود اطلاعات جدید توسط کاربر
    textBoxName.Text = String.Empty;
    textBoxAge.Text = String.Empty;
    textBoxGender.Text = String.Empty;
}

وقتی که دکمه add کلیک شود، یک XmlDocument (سند XML) ایجاد می‌شود و مسیر آن هم همان مسیری است که خودمان به صورت یک ثابت تعریف کرده‌ایم (PATH = @”C:sample.xml”;). حال با استفاده از متد ()Exists تست می‌کنیم که آیا فایل ایجاد شده است یا نه؟ اگر وجود نداشت فایل جدید را ایجاد و اولین رکورد را اضافه می‌کنیم و اگر وجود داشت، رکورد جدید را به آخر آن اضافه می‌کنیم. اجازه دهید در مورد کدها وقتی که فایل برای اولین بار ایجاد می‌شود بحث کنیم :

 //Create neccessary nodes
XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
XmlComment comment = doc.CreateComment("This is an XML Generated File");
XmlElement root = doc.CreateElement("Persons");
XmlElement person = doc.CreateElement("Person");
XmlAttribute name = doc.CreateAttribute("name");
XmlElement age = doc.CreateElement("Age");
XmlElement gender = doc.CreateElement("Gender");

کد بالا گره‌های لازم برای ایجاد سند XML را ایجاد می‌کند. ابتدا یک تعریف برای سند با استفاده از کلاس XmlDeclaration و متد CreateXmlDeclaration از کلاس XmlDocument ایجاد می‌کنیم. همانطور که در خط سوم مثال بالا می‌بینید، این متد سه پارامتر قبول می‌کند. سپس یک توضیح را با استفاده از کلاس XmlComment و متد CreateComment و آن را برای استفاده متد ارسال می‌کنیم. من این توضیح را برای نشان دادن چگونگی ایجاد و استفاده از توضیحات اضافه کرده‌ام. سپس با استفاده از متد CreateElement و کلاس XmlElement عنصر ریشه را ایجاد می‌کنیم. از کلاس CreateElement برای ایجاد عنصر ریشه، پدر و عناصر فرزند استفاده می‌شود. این متد یک آرگومان از نوع رشته قبول می‌کند که همان نام عنصر است. سپس یک شخص جدید را نگهداری اطلاعات وارد شده توسط کاربرایجاد می‌کنیم.
عنصر Person یک صفت به نام name و دو فرزند سن (Age) و جنسیت (Gender) دارد. متد CreateAttribute یک آرگومان از نوع رشته قبول می‌کند که همان نام صفت است. جزییات صفت در یک شئ XmlAttribute ذخیره می‌شود. از آنجاییکه Person، Age و Gender عنصر هستند در نتیجه ما از متد CreateElement و کلاس XmlElement برای آنها استفاده کرده‌ایم.

name.Value = textBoxName.Text;
age.InnerText = textBoxAge.Text;
gender.InnerText = textBoxGender.Text;

حال نوبت به اضافه کردن مقادیر به گره‌هاست. این مقادیر توسط کاربر و از طریق کنترل‌های textBox اضافه می‌شوند. شئ XmlAttribute از خاصیت Value برای دسترسی و مقداردهی گره‌ها و XmlElement از InnerText یا InnerXml برای اضافه کردن مقادیر به داخل گره‌ها استفاده می‌کند.

doc.AppendChild(declaration);
doc.AppendChild(comment);
doc.AppendChild(root);
root.AppendChild(person);
person.Attributes.Append(name);
person.AppendChild(age);
person.AppendChild(gender);

می‌خواهیم قسمت‌های مختلف را برای ایجاد یک سند کامل XML کنار هم قرار دهیم. ابتدا قسمت تعاریف سند را با استفاده از متد ()AppendChild که یک XmlNode قبول می‌کند به عنوان آخرین فرزند به سند اضافه می‌کنیم. سپس توضیحات را درست در پایین قسمت تعاریف اضافه می‌کنیم. عنصر ریشه را نیز در پایین قسمت توضیحات قرار می‌دهیم. به این نکته توجه کنید که ترتیب اضافه کردن گره‌ها مهم است. بعد از ایجاد عنصر ریشه گره‌های لازم را به داخل آن اضافه کنیم. یک عنصر person به عنصر ریشه و سپس با استفاده از متد ()Append یک صفت name به خاصیت Attributes آن اضافه می‌کنیم. و در نهایت عناصر age و gender را به عنصر person اضافه می‌کنیم. به این نکته توجه کنید که ترتیب ایجاد عناصر مهم نیست. به عنوان مثال می‌توان ابتدا عنصر person را ایجاد و کامل و بعد آن را به عنصر ریشه اضافه کنید. اما بهتر است که ایجاد قسمت تعریف، توضیحات و عنصر ریشه به ترتیب باشد.

doc.Save(PATH);

این متد سند XML ایجاد شده را در مسیر مشخص شده ذخیره می‌کند. اجازه دهید به قسمت else کد بالا نگاهی بیندازیم. این قسمت زمانی اجرا می‌شود که فایل XML از قبل وجود داشته باشد. این قسمت فایل XML را بارگذاری کرده و به ما اجازه می‌دهد که شخص جدیدی را به لیست اشخاص موجود در عنصر ریشه اضافه کنیم.

//Load the XML File
doc.Load(PATH);

//Get the root element
XmlElement root = doc.DocumentElement;

وقتی که فایل XML با استفاده از متد Load بارگذاری شد، عنصر ریشه با استفاده از خاصیت DocumentElement برگردانده می‌شود. حال که به عنصر ریشه دسترسی داریم می‌توانیم عناصر بیشتری به آن اضافه کنیم. یک شخص جدید را با استفاده از مواردی که توسط کاربر وارد می‌شود ایجاد و آن را به آخر لیست عناصر فرزند اضافه می‌کنیم.
سپس فایل XML را بوسیله متد ()Save بروزرسانی می‌کنیم. خطوط آخر برای نمایش یک پیغام موفقیت و پاک کردن فیلدهای متنی برای ورود اطلاعات جدید به کار می‌روند. برنامه را اجرا و حداقل دو فیلد (مثلاً سن و نام) را وارد کنید. فایل XML در مسیری که در متغیر PATH تعیین شده است ایجاد می‌شود. شما می‌توانید مسیر ذخیره فایل را تغییر دهید. فایل XML را باز کرده و محتویات آن را مشاهده کنید.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--This is an XML Generated File-->
<Persons>
  <Person name="John Smith">
    <Age>30</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Lisa Carter">
    <Age>22</Age>
    <Gender>Female</Gender>
  </Person>
</Persons>

اکنون یک فایل XML را با استفاده از متدها و کلاس‌های XML DOM با موفقیت تولید کرده‌اید. شما می‌توانید با متدهای بیشتری کار و عملکرد آنها را تجربه کنید.