تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
ملفاتxml(كتابة ,قراءة ,تعديل ,حذف)
#1
بسم الله الرحمن الرحيم
((رب اشرح لي صدري ويسر لي امري واحلل عقدة من لساني يفقهوا قولي))
صدق الله العلي العظيم

السلام عليكم ورحمة الله وبركاته

الموضوع واضح من عنوانه وهو اننا سنتعامل مع ملف 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 getset; }
            public 
string Name getset; }
            public 
string Gender getset; }
            public 
int Age getset; }
        }
#endregion 

المتغيرات العالمة:

PHP كود :
#region المتغيرات العامة
        
private XElement xel,empinfoidnameage;
        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 senderEventArgs e)
        {
            
bool found false;
            if (
File.Exists(xpath))
            {
                
xel XElement.Load(xpath);
                
//لعدم تكرار موظف بنفس التسلسل
                
for (int i 0emp.Counti++)
                {
                    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(idnameage);

                
xel.Add(empinfo);
                
xel.Save(xpath);
                
pos xel.Nodes().Count() - 1;
                
read_btn_Click(sendere);
            }
            else
            {
                
MessageBox.Show("هذا التسلسل موجود ,اختر تسلسلا آخر","");
            }
        } 

نأتي الى شرح الكود أعلاه:

اولا نتأكد ما اذا كان الملف موجود مسبقا فنقوم بقرائته فقط ومن ثم نتأكد من عدم تكرار التسلسل لاكثر من مرة ونقوم باضافة العناصر اليها أما اذا كان الملف غير موجود فنقوم بانشاء الجذر الرئيسي للملف باسم Info وعقدة فرعية باسم EmpInfo تضم العقد التالية: (ID, Name, Age) والعقدة Name لديها خاصية باسم Gender والعقدة EmpInfo لديها خاصية باسم EmpInfo وتستطيع تغيير الصفات أو الخصائص كما تشاء. وفي الاخير نقوم بحفظ الملف.

طبعا هنالك عدة طرق لاضافة عناصر الى ملف XML وانا اخترت الكائن XElement ضمن مجال الاسماء XML.Linq فهي برأيي اسهل طريقة لانشاء ملف واضافة العناصر والصفات لعنصر معين من العناصر.

كود القراءة:

PHP كود :
private void read_btn_Click(object senderEventArgs 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 senderEventArgs 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(sendere);
        } 

اعتقد الكود سهل جدا ولا يحتاج الى شرحSmile

كود الحذف:

PHP كود :
private void delete_btn_Click(object senderEventArgs 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 senderEventArgs 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 senderEventArgs e)
        {
            if (
pos emp.Count 1)
            {
                
pos++;
                
Fill(pos);
            }
        }

        private 
void prev_btn_Click(object senderEventArgs e)
        {
            if (
pos 0)
            {
                
pos--;
                
Fill(pos);
            }
        }

        private 
void last_btn_Click(object senderEventArgs e)
        {
            
Fill(pos emp.Count 1);
        }

        private 
void first_btn_Click(object senderEventArgs e)
        {
            
Fill(pos 0);
        }

        private 
void clear_btn_Click(object senderEventArgs e)
        {
            
id_txt.Text name_txt.Text age_txt.Text "";
            
Male_rdbtn.Checked Female_rdbtn.Checked false;
        }

        private 
void linkLabel1_LinkClicked(object senderLinkLabelLinkClickedEventArgs e)
        {
            
System.Diagnostics.Process.Start("http://vb4arb.com/vb/forum.php");
        } 

المثال في المرفقات

الحمد لله ولاتنسونا من صالح دعواتكمSmile



الملفات المرفقة
.rar   XML_Manipulating.rar (الحجم : 36.45 ك ب / التحميلات : 91)
الرد }}}
تم الشكر بواسطة:
#2
ماشاء الله عمل تشكر عليه اخي الكريم ،،،،

هل ممكن نحفظ صورة الموظف مع السجل واقصد هنا حفظ بايتات الصورة وليس مسارها ؟

وشكرا جزيلاً
الرد }}}
تم الشكر بواسطة:
#3
السلام عليكم

بارك الله فيك اخي الكريم

نعم يمكن ذلك لكن حفظ الصورة بالـBytes يستغرق وقت طويل جدا لذا يجب تحويل الـBytes الى سلسلة نصية لاستغراقها اقل وقت ممكن

PHP كود :
MemoryStream m=new MemoryStream();
                
pictureBox1.Image.Save(m,System.Drawing.Imaging.ImageFormat.Jpeg);
                
//or
                //byte[] im = File.ReadAllBytes("ImagePath");
                //string res = Convert.ToBase64String(im);
                
string res Convert.ToBase64String(m.ToArray());
                
img = new XElement("Img"res); 

انا افضل طريقة الحفظ في الذاكرة

موفق اخي الكريم
الرد }}}
تم الشكر بواسطة:
#4
السلام عليكم

المثال بلغة VB.Net في المرفقات


الملفات المرفقة
.rar   XML_Mnipulating_VB.rar (الحجم : 51.13 ك ب / التحميلات : 51)
الرد }}}
تم الشكر بواسطة:
#5
السلام عليكم ورحمة الله
انا لسه فاتح الموضوع الان ولسه لم اقرءاه
لاكنى حبيت ان اعبر عن حزنى الشديد وزعلى منك اخى سجآد
انت تعرف انى كنت محتاج موضع زى ده وسئلت عن ذلك وانتا اجبت ولم نصل لحل فى النهاية مما جعلنى اصرف نظر
والان ارى مثل هذا الموضوع وهو منذ 6 ايام لماذا لم تعلمنى عن هذا الموضوع
الرد }}}
تم الشكر بواسطة:
#6
ali.alfoly كتب :[b]السلام عليكم ورحمة الله
انا لسه فاتح الموضوع الان ولسه لم اقرءاه
لاكنى حبيت ان اعبر عن حزنى الشديد وزعلى منك اخى سجآد
انت تعرف انى كنت محتاج موضع زى ده وسئلت عن ذلك وانتا اجبت ولم نصل لحل فى النهاية مما جعلنى اصرف نظر
والان ارى مثل هذا الموضوع وهو منذ 6 ايام لماذا لم تعلمنى عن هذا الموضوع

وعليكم السلام ورحمة الله وبركاته اخي الغالي

اسف جدا لانني نسيت ان اخبرك فقد التهيت بامور اخرى ونسيت انك كنت قد سألت مثل هكذا سؤال

فارجو منك ان تقبل اعتذاري وأسفي الشديدSad[/b]
الرد }}}
تم الشكر بواسطة:
#7
جزاك الله خير اخى والله انى احبك فى الله واسئل الله تعالى ان يجمعنا فى الفردوس الاعلى
الرد }}}
تم الشكر بواسطة:
#8
وجزاك بالمثل بارك الله فيك آمين اخي العزيز

وآمل انك استفدت من المقالة

واتمنى لك التوفيق
الرد }}}
تم الشكر بواسطة:
#9
أخي sajad

جزاك الله خير على المثال .

وأتمنى من شخصكم الكريم إضافة حفظ الصورة مع السجل ،،،،

ياحبذا لو بالطريقتين حفظ بايتات الصورة وأيضاً حفظ مسار الصورة وعرض الصورة مع البيانات .....

حتى يكون مرجع لنا كلنا في المنتدى اليوم ومستقبلاً ........

شاكر ومقدر
الرد }}}
تم الشكر بواسطة:
#10
السلام عليكم

المثال في المرفقات بعد التعديل واضافة حقل الصورة اليه لكن بـ#C ,ان شاءالله حالما احوله الى VB سأرفقه في هذا الموضوع

حفظ الصورة عن طريق تحويلها الى سلسلة نصية String لانها تستغرق وقت أقل في الحفظ والقراءة

اذا اردت حفظها كـBytes فقط أسند مصفوفة الـbytes اثناء الحفظ هكذا:

PHP كود :
image = new XElement("Img"bytearray); 



الملفات المرفقة
.rar   XML_Manipulating.rar (الحجم : 88.69 ك ب / التحميلات : 40)
الرد }}}
تم الشكر بواسطة:


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم