18-06-13, 11:36 PM
بسم الله الرحمن الرحيم
((رب اشرح لي صدري ويسر لي امري واحلل عقدة من لساني يفقهوا قولي))
صدق الله العلي العظيم
السلام عليكم ورحمة الله وبركاته
الموضوع واضح من عنوانه وهو اننا سنتعامل مع ملف XML من حيث الانشاء والكتابة والتعديل والحذف والقراءة
XML: مختصر لكلمة (Extensible Markup Language) أي (لغة التوصيف الموسعة) وهي ليست لغة برمجة بل نستطيع ان نقول بانها بيانات او كتابات نصية تكتب بقواعد محددة متعارف عليها وهي شبيهة جدا بـHTML من حيث كتابة الاكواد كونها تستخدم الوسوم (Tags) في كتابة الاكواد لكنها غير مقيدة بكلمات محددة مثل الـHTML أي تستطيع كتابة أي كلمة لتكوين الجذور والعقد والعقد الفرعية ,كما أن الـXML تستخدم لتخزين البيانات بغض النظر عن كيفية عرضها وتتميز ملف الـXML بكونها صغيرة الحجم مقارنة بملفات قواعد البيانات وسهلة الوصول الى البيانات و التعامل معها ,من استعمالاتها خزن البيانات ومشاركتها من قبل قواعد البيانات حيث يمكن تصدير الجدول الى ملف XML واستيراد ملف XML.
تتكون ملف XML من جذر وعقدة وعقة فرعية وايضا يمكن تحديد صفة العقدة ايضا وتسمى هذه الخاصية بالـAttribute وتمثل صفة العقدة أو (العنصر) ,لنلق نظرة على ملفXML
((رب اشرح لي صدري ويسر لي امري واحلل عقدة من لساني يفقهوا قولي))
صدق الله العلي العظيم
السلام عليكم ورحمة الله وبركاته
الموضوع واضح من عنوانه وهو اننا سنتعامل مع ملف XML من حيث الانشاء والكتابة والتعديل والحذف والقراءة
XML: مختصر لكلمة (Extensible Markup Language) أي (لغة التوصيف الموسعة) وهي ليست لغة برمجة بل نستطيع ان نقول بانها بيانات او كتابات نصية تكتب بقواعد محددة متعارف عليها وهي شبيهة جدا بـHTML من حيث كتابة الاكواد كونها تستخدم الوسوم (Tags) في كتابة الاكواد لكنها غير مقيدة بكلمات محددة مثل الـHTML أي تستطيع كتابة أي كلمة لتكوين الجذور والعقد والعقد الفرعية ,كما أن الـXML تستخدم لتخزين البيانات بغض النظر عن كيفية عرضها وتتميز ملف الـXML بكونها صغيرة الحجم مقارنة بملفات قواعد البيانات وسهلة الوصول الى البيانات و التعامل معها ,من استعمالاتها خزن البيانات ومشاركتها من قبل قواعد البيانات حيث يمكن تصدير الجدول الى ملف XML واستيراد ملف XML.
تتكون ملف XML من جذر وعقدة وعقة فرعية وايضا يمكن تحديد صفة العقدة ايضا وتسمى هذه الخاصية بالـAttribute وتمثل صفة العقدة أو (العنصر) ,لنلق نظرة على ملفXML
وقد وفرت لنا مكتبة الـNet Framwork وسيلة للتعامل مع هكذا ملفات بسهولة تامة من خلال المكتبات XML أو XML.Linq حيث توفر هاتان المكتبتان كائنات ودوال تمكننا من التعامل مع ملفات الـXML من حيث انشاء ملف او التعديل على ملف........ ألخ.
والان بسم الله سنبدأ بعمل مثال نتعلم من خلاله كتابة ملفات XML
اولا نكون مشروع جديد ونصممه بالشكل التالي:
نأتي الى الاكواد:
المكتبات المطلوبة:
PHP كود :
using System.IO;
using System.Xml;
using System.Xml.Linq;
نصمم Class باسم Emp
PHP كود :
#region Emp Class
class Emp
{
public int ID { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public int Age { get; set; }
}
#endregion
المتغيرات العالمة:
PHP كود :
#region المتغيرات العامة
private XElement xel,empinfo, id, name, age;
private XmlDocument doc = new XmlDocument();
private XmlNode node;
private List<Emp> emp = new List<Emp>();
private int pos = 0;
private string xpath = @"D:\emp.xml";
#endregion
دالة ملئ الحقول في النموذج
PHP كود :
#region Fill Mthod
private void Fill(int pos)
{
id_txt.Text = emp[pos].ID.ToString();
name_txt.Text = emp[pos].Name;
age_txt.Text = emp[pos].Age.ToString();
if (emp[pos].Gender == "ذكر")
Male_rdbtn.Checked = true;
else
Female_rdbtn.Checked = true;
}
#endregion
كود انشاء ملف XML واضافة العقد اليه:
PHP كود :
private void write_btn_Click(object sender, EventArgs e)
{
bool found = false;
if (File.Exists(xpath))
{
xel = XElement.Load(xpath);
//لعدم تكرار موظف بنفس التسلسل
for (int i = 0; i < emp.Count; i++)
{
if (emp[i].ID.ToString() == id_txt.Text)
{
found = true;
}
else
{
found = false;
}
}
}
else
xel = new XElement("Info");
if (!found)
{
string gender = "";
if (Male_rdbtn.Checked)
gender = "ذكر";
else
gender = "انثى";
empinfo = new XElement("EmpInfo");
empinfo.SetAttributeValue("EmpInfo", "EmployeeInformation");
id = new XElement("EId", id_txt.Text);
name = new XElement("EName", name_txt.Text);
name.SetAttributeValue("Gender", gender);
age = new XElement("EAge", age_txt.Text);
empinfo.Add(id, name, age);
xel.Add(empinfo);
xel.Save(xpath);
pos = xel.Nodes().Count() - 1;
read_btn_Click(sender, e);
}
else
{
MessageBox.Show("هذا التسلسل موجود ,اختر تسلسلا آخر","");
}
}
نأتي الى شرح الكود أعلاه:
اولا نتأكد ما اذا كان الملف موجود مسبقا فنقوم بقرائته فقط ومن ثم نتأكد من عدم تكرار التسلسل لاكثر من مرة ونقوم باضافة العناصر اليها أما اذا كان الملف غير موجود فنقوم بانشاء الجذر الرئيسي للملف باسم Info وعقدة فرعية باسم EmpInfo تضم العقد التالية: (ID, Name, Age) والعقدة Name لديها خاصية باسم Gender والعقدة EmpInfo لديها خاصية باسم EmpInfo وتستطيع تغيير الصفات أو الخصائص كما تشاء. وفي الاخير نقوم بحفظ الملف.
طبعا هنالك عدة طرق لاضافة عناصر الى ملف XML وانا اخترت الكائن XElement ضمن مجال الاسماء XML.Linq فهي برأيي اسهل طريقة لانشاء ملف واضافة العناصر والصفات لعنصر معين من العناصر.
كود القراءة:
PHP كود :
private void read_btn_Click(object sender, EventArgs e)
{
srch_btn.Enabled = true;
emp.Clear();
if (File.Exists(xpath))
{
doc.Load(xpath);
node = doc["Info"]["EmpInfo"];
while (node != null)
{
emp.Add(
new Emp
{
ID = int.Parse(node["EId"].InnerText),
Name = node["EName"].InnerText,
Gender=node["EName"].Attributes["Gender"].InnerText,
Age = int.Parse(node["EAge"].InnerText)
}
);
node = node.NextSibling;
}
Fill(pos);
dataGridView1.DataSource = emp;
dataGridView1.Columns[0].HeaderText = "التسلسل";
dataGridView1.Columns[1].HeaderText = "الاسم";
dataGridView1.Columns[2].HeaderText = "الجنس";
dataGridView1.Columns[3].HeaderText = "العمر";
}
}
شرح الكود:
ايضا هنالك طرق عدة للقراءة هنا استخدمت الكائنين XmlNode, XmlDocument الموجودين ضمن مجال الاسماء XML ,اولا نسند العقدة الرئيسية والعقدة التي بعدها الى متغير من الكائن XmlNode أي نسند العقدة EmpInfo الى المتغير node ومن خلاله نقوم بالمرور على العقد التي تحتويها واستخراج محتواها ومن ثم المرور على كل العقد باستخدام الخاصية NextSibling أي العقدة التالية ,أما قراءة محتوى العقدة فتتم عن طريق خاصية InnerText بعد ذكر اسم العقدة أما الوصول الى صفة عقدة معينة اولا نذكر اسم العقدة ومن ثم اسم الخاصية ومن ثم InnerText. فكما ترون سهلة جدا الوصول الى محتوى أي عقدة في الملف.
كود التعديل:
PHP كود :
private void update_btn_Click(object sender, EventArgs e)
{
node = doc["Info"]["EmpInfo"];
while (node != null)
{
if (node["EId"].InnerText == id_txt.Text)
{
emp[pos].ID = int.Parse(node["EId"].InnerText = id_txt.Text);
emp[pos].Name = node["EName"].InnerText = name_txt.Text;
emp[pos].Age = int.Parse(node["EAge"].InnerText = age_txt.Text);
}
node = node.NextSibling;
}
doc.Save(xpath);
read_btn_Click(sender, e);
}
اعتقد الكود سهل جدا ولا يحتاج الى شرح
كود الحذف:
PHP كود :
private void delete_btn_Click(object sender, EventArgs e)
{
node = doc["Info"]["EmpInfo"];
while (node != null)
{
if (node["EName"].InnerText == name_txt.Text)
{
node.ParentNode.RemoveChild(node);
emp.RemoveAt(int.Parse(id_txt.Text) - 1);
}
node = node.NextSibling;
}
doc.Save(xpath);
pos--;
if (pos < 0)
pos = 0;
Fill(pos);
}
شرح الكود:
نقوم بحذف عقدة معينة حسب الاسم عن طريق هذا السطر:
PHP كود :
node.ParentNode.RemoveChild(node);
هذا السطر بحذف العقدة (EmpInfo) التي تنتمي للعقدة الرئيسية Info وعند حذف العقدة (EmpInfo) ستحذف جميع العقد التي تحتويها ومن ضمنها محتوى العقد او العناصر.
فـ ParentNode=Info
وRemoveChild=EmpInfo
كود البحث:
PHP كود :
private void srch_btn_Click(object sender, EventArgs e)
{
string gender = "";
if (File.Exists(xpath))
{
doc.Load(xpath);
node = doc["Info"]["EmpInfo"];
while (node != null)
{
if (node["EName"].InnerText == Srch_txt.Text.Trim())
{
id_txt.Text = node["EId"].InnerText;
name_txt.Text = node["EName"].InnerText;
gender = node["EName"].Attributes["Gender"].InnerText;
age_txt.Text = node["EAge"].InnerText;
pos = int.Parse(id_txt.Text) - 1;
if (gender == "ذكر")
Male_rdbtn.Checked = true;
else
Female_rdbtn.Checked = true;
}
node = node.NextSibling;
}
}
}
بقية الاكواد:
PHP كود :
private void next_btn_Click(object sender, EventArgs e)
{
if (pos < emp.Count - 1)
{
pos++;
Fill(pos);
}
}
private void prev_btn_Click(object sender, EventArgs e)
{
if (pos > 0)
{
pos--;
Fill(pos);
}
}
private void last_btn_Click(object sender, EventArgs e)
{
Fill(pos = emp.Count - 1);
}
private void first_btn_Click(object sender, EventArgs e)
{
Fill(pos = 0);
}
private void clear_btn_Click(object sender, EventArgs e)
{
id_txt.Text = name_txt.Text = age_txt.Text = "";
Male_rdbtn.Checked = Female_rdbtn.Checked = false;
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start("http://vb4arb.com/vb/forum.php");
}
المثال في المرفقات
الحمد لله ولاتنسونا من صالح دعواتكم