LINQ to XML - Part 3

يحوي الدروس و الملخصات التي قام أعضاء الموقع بكتابتها .

المشرف: Mohammad_807

LINQ to XML - Part 3

مشاركة غير مقروءةبواسطة HammooD » الأحد إبريل 18, 2010 11:27 pm

تحدثنا المرة الماضية عن تقنية Linq و الآن سنكمل الحديث عن التعامل مع الـ XML فيها :
XML Modification :
سنرى في هذا القسم طرق تعديل ملف XML موجود مسبقاً أي كيفية إجراء عمليات الإضافة و الحذف و التعديل على هذا الملف و سنبدأ بالإضافة .
-الإضافة :
في البداية لنقم بإنشاء ملف XML صغير لنقوم بالعمل عليه :
CODE: تحديد الكل
XDocument xDocument1 = new XDocument(
                        new XElement("BookParticipants",
                        new XElement("BookParticipant",
                        new XAttribute("type", "Author"),
                        new XElement("FirstName", "Mohammad"),
                  new XElement("LastName", "Hammod"))));

الإضافة باستخدام Add :
نستطيع إضافة عنصر جديد عن طريق تحديد اسم العنصر المراد الإضافة له ثم استعمال التابع Add الذي يأخد العنصر الجديد كوسيط كما يلي :
CODE: تحديد الكل
xDocument1.Element("BookParticipants").Add(
                     new XElement("BookParticipant",
                     new XAttribute("type", "Editor"),
                     new XElement("FirstName", "Mohammad"),
                     new XElement("LastName", "_807")));

الإضافة تمت على نهاية الملف السابق و عند طباعة الملف سنجد الخرج التالي :
CODE: تحديد الكل
Console.WriteLine(xDocument1);

الخرج :
CODE: تحديد الكل
<BookParticipants>
  <BookParticipant type="Author">
    <FirstName>Mohammad</FirstName>
    <LastName>Hammod</LastName>
  </BookParticipant>
  <BookParticipant type="Editor">
    <FirstName>Mohammad</FirstName>
    <LastName>_807</LastName>
  </BookParticipant>
</BookParticipants>


• الإضافة باستعمال AddFirst :

و يكون الكود على الشكل التالي :

CODE: تحديد الكل
xDocument1.Element("BookParticipants").AddFirst(
              new XElement("BookParticipant",
              new XAttribute("type", "Editor"),
              new XElement("FirstName", "Tarek"),
              new XElement("LastName", "M3rrawi"))); // the element now is at the Beginning of the file.

طبعاً سيصبح العنصر الجديد في بداية الملف و يمكننا استعمال Add ليصبح العنصر الجديد عندها في نهاية الملف .
• الإضافة باستعمال AddBeforeSelf :

هنا نحدد عنصراً ما ثم نستخدم AddBeforeSelf لإضافة العنصر الجديد قبل العنصر الذي قمنا باختياره كما يلي :
CODE: تحديد الكل
xDocument1.Element("BookParticipants").
            Elements("BookParticipant").
            Where(e => ((string)e.Element("FirstName")) == "Tarek").
            Single<XElement>().AddBeforeSelf(
                new XElement("BookParticipant",
                new XAttribute("type", "Technical Reviewer"),
                new XElement("FirstName", "Nawwar"),
                new XElement("LastName", "soso")));

لاحظوا كيف قمنا باختيار العنصر عن طريق تعليمة Where ثم استخدمنا AddBeforeDelf .
الآن سيكون الخرج على الشكل :
CODE: تحديد الكل
<BookParticipants>
  <BookParticipant type="Technical Reviewer">
    <FirstName>Nawwar</FirstName>
    <LastName>soso</LastName>
  </BookParticipant>
  <BookParticipant type="Editor">
    <FirstName>Tarek</FirstName>
    <LastName>M3rrawi</LastName>
  </BookParticipant>
  <BookParticipant type="Author">
    <FirstName>Mohammad</FirstName>
    <LastName>Hammod</LastName>
  </BookParticipant>
  <BookParticipant type="Editor">
    <FirstName>Mohammad</FirstName>
    <LastName>_807</LastName>
  </BookParticipant>
</BookParticipants>

طبعا ينطبق نفس الكلام على AddAfterSelf و لكن سيتم إضافة العنصر الجديد بعد العنصر المحدد.
-التعديل :
• التعديل باستخدام القيمة Value :
في البداية نحدد العنصر المراد تعديله ثم نعدل بالقيمة المطلوبة عن طريق استخدام الخاصية Value كما في الكود التالي :
CODE: تحديد الكل
XElement elementToUpdate =   xDocument1.Element("BookParticipants").
                    Elements("BookParticipant").
                    Single(e => ((string)e.Element("FirstName")) == "Tarek");
               
                //using Value to Update
                elementToUpdate.Element("FirstName").Value = "New_Tarek";


الخرج :
CODE: تحديد الكل
<BookParticipants>
  <BookParticipant type="Technical Reviewer">
    <FirstName>Nawwar</FirstName>
    <LastName>soso</LastName>
  </BookParticipant>
  <BookParticipant type="Editor">
    <FirstName>New_Tarek</FirstName>
    <LastName>M3rrawi</LastName>
  </BookParticipant>
  <BookParticipant type="Author">
    <FirstName>Mohammad</FirstName>
    <LastName>Hammod</LastName>
  </BookParticipant>
  <BookParticipant type="Editor">
    <FirstName>Mohammad</FirstName>
    <LastName>_807</LastName>
  </BookParticipant>
</BookParticipants>

• التعديل باستخدام ReplaceAll :
أيضاً هنا نحدد العنصر المراد تعديل كافة محتوياته ثم نستدعي التابع ReplaceAll و نمرر له القيم الجديدة :
CODE: تحديد الكل
XElement elementToReplace = xDocument1.Element("BookParticipants").Element("BookParticipant");

elementToReplace.ReplaceAll(new XElement("FirstName","Replaced"),new XElement("LastName","Replaced") );


الخرج الجديد :
CODE: تحديد الكل
<BookParticipants>
  <BookParticipant>
    <FirstName>Replaced</FirstName>
    <LastName>Replaced</LastName>
  </BookParticipant>
  <BookParticipant type="Editor">
    <FirstName>New_Tarek</FirstName>
    <LastName>M3rrawi</LastName>
  </BookParticipant>
  <BookParticipant type="Author">
    <FirstName>Mohammad</FirstName>
    <LastName>Hammod</LastName>
  </BookParticipant>
  <BookParticipant type="Editor">
    <FirstName>Mohammad</FirstName>
    <LastName>_807</LastName>
  </BookParticipant>
</BookParticipants>

-الحذف :
• الحذف باستخدام Remove :
في البداية يجب تحديد العنصر المراد حذفه ثم استدعاء التابع Remove على هذا العنصر :
1- تحديد العنصر
CODE: تحديد الكل
 
XElement elementToRemove = xDocument1.Element("BookParticipants").
          Elements("BookParticipant").
          Single(e => ((string)e.Element("FirstName")) == "New_Tarek");

2- حذف العنصر :
CODE: تحديد الكل
elementToRemove.Remove();


• الحذف باستخدام IEnumerable<T>.Remove() :
هنا نقوم بحذف مجموعة محددة من العنصر و يمكن اختيار المجموعة عن طريق تطبيق شرط ما على الملف :

CODE: تحديد الكل
xDocument1.Descendants().Where(e => e.Name == "FirstName").Remove();


هنا قمنا بحذف جميع العناصر "FirstName"و لن يبقى سوى LastName.
الخرج :
CODE: تحديد الكل
<BookParticipants>
  <BookParticipant>
    <LastName>Replaced</LastName>
  </BookParticipant>
  <BookParticipant type="Author">
    <LastName>Hammod</LastName>
  </BookParticipant>
  <BookParticipant type="Editor">
    <LastName>_807</LastName>
  </BookParticipant>
</BookParticipants>


• الحذف باستخدام RemoveAll :
هنا نحدد عنصراً ما لحذف جميع محتوياته ثم نستدعي RemoveAll :

CODE: تحديد الكل
xDocument1.Element("BookParticipants").RemoveAll();


هنا استدعينا التابع من أجل العقدة الأب في الملف لذلك عند الطباعة لن يظهر شيء كما يلي :
CODE: تحديد الكل
<BookParticipants />


Simple Xml Parsing :

قبل أن نبدأ بالشرح لنقم بإنشاء صف صغير يعبر عن Tutorial معين :
CODE: تحديد الكل
    public class Tutorial
    {
        public string Author { get; set; }
        public string Title { get; set; }
        public DateTime Date { get; set; }
    }
   

و من ثم لننشأ ملف XML بإسم TestFile و نضعه مع المشروع :
CODE: تحديد الكل
<?xml version="1.0" encoding="utf-8" ?>
<Tutorials>
  <Tutorial>
    <Author>The Reddest</Author>
    <Title>
      Creating an XP Style WPF Button with Silverlight
    </Title>
    <Date>2/20/2008</Date>
  </Tutorial>
  <Tutorial>
    <Author>The Fattest</Author>
    <Title>
      Flex And Yahoo Maps
    </Title>
    <Date>2/12/2007</Date>
  </Tutorial>
  <Tutorial>
    <Author>The Tallest</Author>
    <Title>
      WPF Tutorial - Creating A Custom Panel Control
    </Title>
    <Date>2/18/2008</Date>
  </Tutorial>
</Tutorials>

الآن سنقوم بوضع هذا الملف في List عن طريق وضع كل Tutorial (لاحظ أن عددها هو ثلاثة) في كائن من الصف Tutorial أي سينشأ لدينا List تحوي ثلاث كائنات من النوع Tutorial :
CODE: تحديد الكل
XDocument xmlDoc1 = XDocument.Load("TestFile.xml");
List<Tutorial> tutorials1 =
              (from tutorial in xmlDoc1.Descendants("Tutorial")
               select new Tutorial
               {
                   Author = tutorial.Element("Author").Value,
                   Title = tutorial.Element("Title").Value,
                   Date = DateTime.Parse(tutorial.Element("Date").Value),
               }).ToList<Tutorial>();

الآن يمكننا طباعة النتائج كما يلي :
CODE: تحديد الكل
Tutorial[] TutArray = tutorials1.ToArray();
for (int i = 0; i < tutorials1.Count; i++)
{
     Console.WriteLine(TutArray[i].Author + TutArray[i].Title +   TutArray[i].Date);
}

و الناتج هو :
The Reddest
Creating an XP Style WPF Button with Silverlight
2/20/2008 12:00:00 AM
The Fattest
Flex And Yahoo Maps
2/12/2007 12:00:00 AM
The Tallest
WPF Tutorial - Creating A Custom Panel Control
2/18/2008 12:00:00 AM


يمكننا أيضاً إضافة شرط معين لاختيار العناصر كما يلي :
CODE: تحديد الكل
List<Tutorial> tutorials2 =
           (from tutorial in xmlDoc1.Descendants("Tutorial")
           where tutorial.Element("Author").Value == "The Tallest"                            select new Tutorial
                   {
                       Author = tutorial.Element("Author").Value,
                       Title = tutorial.Element("Title").Value,
                       Date = DateTime.Parse(tutorial.Element("Date").Value),
                   }).ToList<Tutorial>()


إلى هنا نكون قد أنهينا مبادئ Linq to XML و غطينا جزءاً كبيراً منها و يوجد الكثير من الكتب و الشروحات التي تتوسع في طرح الأفكار و تحوي أمثلة عديدة لمن يريد الاستزادة ...
مع التمنيات بالتوفيق و الفائدة .



Happy Programming!
-----------------------------------------------------------------------------
HammooD 18/4/2010
m-khaled89@hotmail.com

الشرح بصيغة PDF :
LINQ2XML Part3 By HammooD.rar


ملف المشروع للأجزاء الثلاثة :
LINQ2XML_pro.rar
A man who won't die for something is not fit to live
صورة العضو الشخصية
HammooD
متميز برمجة عام
متميز برمجة عام
 
مشاركات: 2199
اشترك في: الأربعاء مارس 05, 2008 4:12 pm
الجتس: ذكر
الشهادة الثانوية: سورية
الجامعة: جامعة دمشق
الكلية: الهندسة المعلوماتية
المرحلة الدراسية: السنة الخامسة
الاختصاص: شبكات و نظم

Re: LINQ to XML - Part 3

مشاركة غير مقروءةبواسطة life moon » الاثنين إبريل 19, 2010 8:04 am

شكرا كتير محمد
الله يجزيك الخير يارب
life moon
عضو نشيط
عضو نشيط
 
مشاركات: 1085
اشترك في: الخميس يناير 31, 2008 7:45 am
الجتس: أنثى
الشهادة الثانوية: سورية
الجامعة: جامعة دمشق
الكلية: الهندسة المعلوماتية
المرحلة الدراسية: السنة الخامسة
الاختصاص: ذكاء صنعي


العودة إلى دروس في البرمجة

الموجودون الآن

المستخدمون المتصفحون لهذا المنتدى: لا يوجد أعضاء مسجلين متصلين و 1 زائر

cron