العمل مع XML في C# (.NET): من الأساسيات إلى التقنيات المتقدمة
XML (لغة الترميز القابلة للتوسيع) لا يزال أحد التنسيقات الرئيسية لتخزين ونقل البيانات المنظمة في بيئة .NET. بغض النظر عما إذا كنت تقوم بإنشاء ملفات تكوين، أو تبادل البيانات مع خدمات الويب، أو معالجة المستندات، فإن الأدوات المضمنة في C# توفر أدوات مرنة وفعالة للعمل مع XML. في هذه المقالة، سنستعرض ثلاثة نهج رئيسية: الكلاسيكي XmlDocument، والحديث XDocument (LINQ to XML)، والتدفقي XmlReader/XmlWriter.
1. XmlDocument الكلاسيكي (نموذج DOM)
الفئة System.Xml.XmlDocument تطبق نموذج كائن المستند (DOM) — حيث تقوم بتحميل مستند XML بالكامل إلى الذاكرة العشوائية على شكل شجرة من العقد. هذا مناسب للمستندات الصغيرة والمتوسطة الحجم عندما تكون هناك حاجة للتنقل والتعديل المتكرر.
تحميل وقراءة XML
using System.Xml;
XmlDocument doc = new XmlDocument();doc.Load("books.xml"); // تحميل من ملف
// الحصول على العنصر الجذرXmlElement root = doc.DocumentElement;
// اختيار جميع عناصر bookXmlNodeList books = root.SelectNodes("//book");foreach (XmlNode book in books){ string title = book["title"].InnerText; string author = book["author"].InnerText; Console.WriteLine($"{title} — {author}");}إنشاء وحفظ XML
XmlDocument doc = new XmlDocument();XmlElement root = doc.CreateElement("library");doc.AppendChild(root);
XmlElement book = doc.CreateElement("book");book.SetAttribute("id", "1");
XmlElement title = doc.CreateElement("title");title.InnerText = "الحرب والسلام";book.AppendChild(title);
root.AppendChild(book);doc.Save("library.xml");2. LINQ to XML الحديث (XDocument)
مساحة الأسماء System.Xml.Linq تقدم واجهة برمجة تطبيقات أكثر إيجازًا ووظيفية. XDocument و XElement تسمح بكتابة كود بأسلوب LINQ، وهو مناسب بشكل خاص للاستعلامات والتحويلات.
التحليل باستخدام XDocument
using System.Xml.Linq;
XDocument doc = XDocument.Load("books.xml");
var books = doc.Descendants("book") .Select(b => new { Title = b.Element("title")?.Value, Author = b.Element("author")?.Value, Year = (int)b.Element("year") });
foreach (var book in books){ Console.WriteLine($"{book.Title} ({book.Year})");}إنشاء XML باستخدام المنشئات
XDocument doc = new XDocument( new XElement("library", new XElement("book", new XAttribute("id", "1"), new XElement("title", "الجريمة والعقاب"), new XElement("author", "ف.م. دوستويفسكي") ) ));doc.Save("library.xml");مزايا XDocument:
- دعم استعلامات LINQ لتصفية وإسقاط البيانات.
- صيغة أكثر قابلية للقراءة لإنشاء العناصر من خلال المنشئات المتداخلة.
- معالجة تلقائية لمساحات الأسماء عبر
XNamespace.
3. المعالجة التدفقية: XmlReader و XmlWriter
للعمل مع ملفات XML كبيرة (مئات الميغابايت أو الجيجابايت)، قد يؤدي استخدام XmlDocument أو XDocument إلى تجاوز الذاكرة. في هذه الحالات، يتم استخدام الفئات التدفقية XmlReader و XmlWriter، التي تعالج البيانات بشكل تسلسلي دون تحميل المستند بالكامل.
القراءة باستخدام XmlReader
using (XmlReader reader = XmlReader.Create("large.xml")){ while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "record") { string id = reader.Get