التعامل مع ملفات XML في الفيجوال ستوديو - 2 -

شرح عملية تعديل البيانات:


النافذة الرئيسية برنامج XML C# & VB.NET


بعد ان انتهينا في الدرس السابق التعامل مع ملفات XML في الفيجوال ستوديو من شرح عملية فتح الملف وعرض بياناته في DataGridView ,, الأن سأقوم بشرح عملية الحفظ والتعديل على ملف XML. أولاً سنقوم بشرح الكود التالي:

شرح كود زر تعديل:
If dataGridView1.SelectedRows.Count = 1 Then
    Dim Company As DataGridViewRow = dataGridView1.SelectedRows(0)

    txtCompanyName.Text = Company.Cells(0).Value.ToString()
    txtCompanyName.Tag = txtCompanyName.Text
            ....                   
End If
if (dataGridView1.SelectedRows.Count == 1)
{
    DataGridViewRow Company = dataGridView1.SelectedRows[0];

    txtCompanyName.Text = Company.Cells[0].Value.ToString();
    txtCompanyName.Tag = txtCompanyName.Text;
            ....                   
}

الكود يقوم بجلب العنصر المحدد في DataGridView ثم يقوم بتعبئة بياناته في صناديق النصوص المناسبة (أي تهيئة البرنامج لعملية التعديل) ,, المهم في الكود هو تخزين اسم الشركة في الخاصية Tag للـ txtCompanyName وذلك من اجل مقارنتها مع القيمة الموجودة في الملف.

شرح كود زر حفظ التعديل:

·         الكود التالي الذي سأشرحه هو لعملية التعديل (ملف XML موجود) :

Dim doc As New XmlDocument()
XmlDocument doc = new XmlDocument();

طبعاً بداية الكود سيكون مع تعريف كائن جديد من الكلاس XMLDocument كي نقوم بالتعامل مع ملف XML.

If IO.File.Exists(Application.StartupPath & "\testXML.xml") Then
    doc.Load(Application.StartupPath & "\testXML.xml")
Else
    Exit Sub
End If
if (System.IO.File.Exists(Application.StartupPath + "\\testXML.xml"))
    doc.Load(Application.StartupPath + "\\testXML.xml");
else
    return;

اولاً نقوم بالتأكد من الملف موجود بالفعل وإلا نخرج من العملية لأن الوصول لهذه النتيجة يعني وجود خطأ ,, في حال وجود الملف وهو ما يجب ان يكون ,, نقوم بفتح الملف وتحميله كما فعلنا سابقاً بواسطة الاجراء Load.

·         الخطوة التالية هي الحصول على مصفوفة العناصر الأبناء التابعة للعنصر الجذر والتي هي تمثل كما شرحنا سابقاً سجلات الملف Records ,, يتم ذلك بواسطة  تعريف كائن من النوع XmlNodeList ثم استدعائه كما يلي:

Dim nodes As XmlNodeList = doc.DocumentElement.ChildNodes
XmlNodeList nodes = doc.DocumentElement.ChildNodes;

·         بعد الحصول على المصفوفة نقوم بعمل حلقة للدوران على جميع العناصر ثم مقارنة اسم الشركة في الملف مع اسم الشركة المراد تعديلها كي نستطيع الوصول للشركة المحددة لتعديل معلوماتها.

سنستخدم الخاصية Tag للـ txtCompanyName للمقارنة وذلك لأن اسم الشركة قد يتم تعديله ايضاً وبذلك لن نجد الشركة المحددة حيث ان اسمها تم تعديله ايضاً ,, ولكن الاسم المخزن في الخاصية Tag لن يستطيع المستخدم تغييره وبذلك نضمن معرفة اسم الشركة قبل تغييره وهو المطلوب كي ينجح الكود:

For i As Integer = 0 To nodes.Count - 1
    If nodes(i).ChildNodes(0).InnerText.Equals(txtCompanyName.Tag) Then
        nodes(i).ChildNodes(0).InnerText = txtCompanyName.Text
        nodes(i).ChildNodes(1).ChildNodes(0).InnerText = txtCountry.Text
        nodes(i).ChildNodes(1).ChildNodes(1).InnerText = txtCity.Text
              ....                 
    End If
Next
for (int i = 0; i < nodes.Count; i++)
{
    if (nodes[i].ChildNodes[0].InnerText.Equals(txtCompanyName.Tag))
    {
        nodes[i].ChildNodes[0].InnerText = txtCompanyName.Text;
  nodes[i].ChildNodes[1].ChildNodes[0].InnerText = txtCountry.Text;
        nodes[i].ChildNodes[1].ChildNodes[1].InnerText = txtCity.Text;
              ....
    }
}
·         أخيراً بعد الانتهاء من التعديل ,, يجب ان نحفظ التعديلات:

doc.Save(Application.StartupPath & "\testXML.xml")
doc.Save(Application.StartupPath + @"\testXML.xml");

شرح عملية حفظ بيانات جديدة:

·         الآن ننتقل للحالة الثانية وهي حفظ المعلومات إلى ملف XML ,, في هذه العملية سيكون لدينا حالتين (ملف XMl موجود , ملف XML غير موجود اي سنقوم بإنشاء ملف وحفظ البيانات فيه لأول مرة).

Dim root As XmlElement

If IO.File.Exists(Application.StartupPath & "\testXML.xml") Then
    doc.Load(Application.StartupPath & "\testXML.xml")
    root = doc.DocumentElement
XmlElement root;

if (System.IO.File.Exists(Application.StartupPath + "\\testXML.xml"))
{
    doc.Load(Application.StartupPath + "\\testXML.xml");
    root = doc.DocumentElement;
}

·         الخطوة الاولى هي إنشاء نسخة من الكائن XMLElement لكي نقوم بجلب العنصر الجذر في الملف ,, ثم نقوم بالتأكد من وجود الملف ,, في حال وجوده نقوم بفتحه ثم الحصول على العنصر الجذر.

·         في الحالة الثانية عدم وجود ملف الـ XML ,, سيتوجب علينا إنشاء ملف XML من الصفر:

Else
    Dim dec As XmlDeclaration = doc.CreateXmlDeclaration("1.0", "utf-8", Nothing)
    doc.AppendChild(dec)
    root = doc.CreateElement("Companies")
    doc.AppendChild(root)
End If
else
{
    XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
    doc.AppendChild(dec);
    root = doc.CreateElement("Companies");
    doc.AppendChild(root);
}

الخطوة الاولى هي إنشاء التاغ أو المؤثر الذي يعرف الملف على انه ملف XML ويحدد ترميز الملف (اذا كنت لا تعرف ما اتكلم عنه فيجب عليك الإطلاع على الدرس الذي يشرح أساسيات ملف XML: مقدمة في XML. بعد إنشائها نقوم بإضافتها إلى الملف عن طريق التابع AppendChild.

بعد ذلك نقوم بإنشاء العنصر الجذر للملف عن طريق التابع CreateElement ونقوم بتحديد اسمه ,, ثم نقوم بإضافته للملف كما فعلنا سابقاً.

·         الأن بقي علينا إضافة المعلومات التي أدخلها المستخدم للبرنامج والتي هي معلومات الشركة (الاسم – المكان - ...):

Dim newCompany As XmlElement = doc.CreateElement("Company")
root.AppendChild(newCompany)
                      
Dim compName As XmlElement = doc.CreateElement("Name")
compName.InnerText = txtCompanyName.Text
newCompany.AppendChild(compName)
……
XmlElement newCompany = doc.CreateElement("Company");
root.AppendChild(newCompany);

XmlElement compName = doc.CreateElement("Name");
compName.InnerText = txtCompanyName.Text;
newCompany.AppendChild(compName);
……

طريقة إضافة المعلومات سهلة جداً ,, البداية تكون بإنشاء عنصر يحمل الاسم المطلوب (في مثالنا Company) ثم اسناده إلى كائن XmlElement , بعد ذلك يجب ان لا ننسى إضافته إلى الملف  (يجب الانتباه هنا) وبالتحديد نضيفه كعنصر ابن للعنصر الجذر root لأني العنصر Company هو يمثل بداية السجل الذي سنضيفه.

ثم نكرر العملية لباقي العناصر المكونة للمعلومات الي سنضيفها ,, فالعنصر الذي يحوي اسم الشركة نقوم بعد إنشاءه بإضافته إلى العنصر الأعلى منه والذي هو (كما في الكود) newCompany لأن العنصر compName هو ابن للعنصر newCompany.

وهكذا .. مع الانتباه كما أشرت عند إضافة العنصر يجب ان نضيفه للعنصر الذي يحويه اي العنصر الأعلى منه في هرمية الملف.

·         أخيراً يجب ان لا ننسى حفظ التعديلات على الملف:

doc.Save(Application.StartupPath & "\testXML.xml")
doc.Save(Application.StartupPath + @"\testXML.xml");

كود الزر حذف:

أخر فقرة في الدرس هي حول كيفية حذف سجل ما من الملف ,, الطريقة سهلة كا ما علينا فعله هو البحث عن السجل المطلوب ثم حذفه:

·         الخطوة الأولى .. بديهياً يجب تحميل الملف وفتحه للتعديل عليه:

Dim doc As New XmlDocument()
doc.Load(Application.StartupPath & "\testXML.xml")
XmlDocument doc = new XmlDocument();
doc.Load(Application.StartupPath + @"\testXML.xml");

·         بعد ذلك نقوم بجلب مصفوفة العناصر الأبناء التابعة للعنصر الجذر كي نبحث داخلها عن السجل المطلوب:

Dim nodes As XmlNodeList = doc.DocumentElement.ChildNodes
XmlNodeList nodes = doc.DocumentElement.ChildNodes;

·         بعد ذلك نعرف نسخة من الكائن XmlNode الذي سيكون مؤشر Pointer للعنصر الذي يحوي السجل المطلوب حذفه:

Dim nodeTodel As XmlNode = Nothing
XmlNode nodeTodel = null;

·         الان نقوم بعمل حلقة للدوران على جميع العناصر والبحث عن السجل المطلوب ثم اسناده للكائن nodeTodel الذي انشئناه في الفقر السابقة:

For i As Integer = 0 To nodes.Count - 1
    Dim companyName As String = dataGridView1.SelectedRows(0).Cells(0).Value.ToString()

    If nodes(i).ChildNodes(0).InnerText.Equals(companyName) Then
        nodeTodel = nodes(i)
        Exit For
    End If
Next
for (int i = 0; i < nodes.Count; i++)
{
    string companyName = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();

    if (nodes[i].ChildNodes[0].InnerText.Equals(companyName))
    {
        nodeTodel = nodes[i];
        break;
    }
}

اذا قمنا بالبحث عن السحل المطلوب عن طريق اسم الشركة الذي اخذناه من العنصر المحدد في DataGridView ثم قمنا باسناد نتيجة البحث للكائن nodeTode.

·         بقي حذف العنصر الذي يحوي السجل:

doc.DocumentElement.RemoveChild(nodeTodel)
doc.DocumentElement.RemoveChild(nodeTodel);

·         أخيراً يجب ان لا ننسى حفظ التغييرات التي قمنا بها على الملف:

doc.Save(Application.StartupPath & "\testXML.xml")
doc.Save(Application.StartupPath + @"\testXML.xml");




7 تعليقات

شكرا لك أخي على هذا الشرح
إذا أردت أن أضيف زر التالي فما هو الكود المستخدم؟
أي الكود المستخدم في التنقل بين السجلات

رد

الكود يتعلق بالبرنامج الذي تعمل عليه وبطريقة عرض البيانات (هل هي في جريد فيو كالمثال الذي شرحته انا ام كيف بالتحديد)

ارفع لي المثال الذي تعمل عليه كي استطيع مساعدتك

رد

البرنامج يعرض البيانات في صندوق النص
هذا هو البرنامج
http://www.4shared.com/rar/O2m4ogZQ/xmltest2.html

رد

حسناً ,, سأقوم برؤية البرنامج

وان شاء الله سأرد عليك في أسرع وقت

بالتوفيق

رد

أخي الكريم قمت بالتعديل على البرنامج ليقوم بجلب السجل التالي والسابق

http://goo.gl/Hq0g2i

أنصحك بقراءة هذا الدرس من جديد والدرس السابق كي تستطيع التعامل من xml بسهولة ولأن حل سؤالك ستجده بعد فهم هذين الدرسين

رد

شكرا لك أخي الكريم وسأعمل بإذن الله على نصيحتك
لا أعرف ماذا أقول غير جزاك الله خيرا

رد

العفو .. اهلاً وسهلاً بك دائماً أخي الكريم

رد

إرسال تعليق