Работа с XML в C# (.NET): Полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с XML в C# (.NET): Полное руководство

XML (eXtensible Markup Language) остаётся одним из ключевых форматов для хранения и передачи структурированных данных в экосистеме .NET. В C# предусмотрено несколько мощных библиотек и подходов для работы с XML, от классического XmlDocument до современного LINQ to XML. В этой статье мы разберём основные инструменты, их особенности и приведём практические примеры для реальных задач.

1. Основные библиотеки для работы с XML в .NET

Платформа .NET предоставляет разработчикам несколько API для обработки XML:

  • System.Xml (XmlDocument, XmlReader, XmlWriter) — классический DOM-подход (Document Object Model). Позволяет загружать весь XML-документ в память и работать с ним как с деревом узлов.
  • LINQ to XML (XDocument, XElement, XAttribute) — современный, более лёгкий и удобный API, интегрированный с LINQ. Рекомендуется для большинства новых проектов.
  • XmlSerializer — для автоматической сериализации и десериализации объектов C# в XML и обратно.
  • XPath (SelectSingleNode, SelectNodes) — язык запросов для навигации по XML-документу. Поддерживается как в XmlDocument, так и в XDocument (через расширения).

2. LINQ to XML: современный подход

Библиотека System.Xml.Linq (LINQ to XML) является предпочтительным выбором для работы с XML в C#. Она предлагает чистый синтаксис, лёгкую загрузку и поддержку LINQ-запросов.

Создание XML-документа

using System.Xml.Linq;

XDocument doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XElement("books",
        new XElement("book",
            new XAttribute("id", "1"),
            new XElement("title", "Война и мир"),
            new XElement("author", "Лев Толстой"),
            new XElement("price", 599.99m)
        ),
        new XElement("book",
            new XAttribute("id", "2"),
            new XElement("title", "Преступление и наказание"),
            new XElement("author", "Фёдор Достоевский"),
            new XElement("price", 450.00m)
        )
    )
);

doc.Save("books.xml");

Загрузка и чтение XML

XDocument loadedDoc = XDocument.Load("books.xml");

// Получение всех книг
var allBooks = loadedDoc.Descendants("book");

foreach (var book in allBooks)
{
    string id = book.Attribute("id")?.Value;
    string title = book.Element("title")?.Value;
    string author = book.Element("author")?.Value;
    Console.WriteLine($"Книга #{id}: {title} — {author}");
}

Запросы с LINQ

// Выбор книг дороже 500 рублей
var expensiveBooks = from book in loadedDoc.Descendants("book")
                     where (decimal)book.Element("price") > 500
                     select new
                     {
                         Title = (string)book.Element("title"),
                         Price = (decimal)book.Element("price")
                     };

foreach (var b in expensiveBooks)
{
    Console.WriteLine($"{b.Title}: {b.Price} руб.");
}

3. Классический XmlDocument

Если вы работаете с унаследованным кодом или требуется полный контроль над DOM, используйте XmlDocument из пространства имён System.Xml.

Загрузка и навигация

using System.Xml;

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("books.xml");

XmlNode root = xmlDoc.DocumentElement;
XmlNodeList bookNodes = root.SelectNodes("book");

foreach (XmlNode node in bookNodes)
{
    XmlNode titleNode = node.SelectSingleNode("title");
    if (titleNode != null)
    {
        Console.WriteLine(titleNode.InnerText);
    }
}

Добавление нового узла

XmlNode newBook = xmlDoc.CreateElement("book");
XmlAttribute idAttr = xmlDoc.CreateAttribute("id");
idAttr.Value = "3";
newBook.Attributes.Append(idAttr);

XmlElement titleElement = xmlDoc.CreateElement("title");
titleElement.InnerText = "Мастер и Маргарита";
newBook.AppendChild(titleElement);

root.AppendChild(newBook);
xmlDoc.Save("books_updated.xml");

4. XPath запросы

XPath — мощный язык для выборки узлов и атрибутов. В .NET он доступен как для XmlDocument, так и для XDocument (через метод XPathSelectElements).

using System.Xml.XPath;

// Пример для XDocument
XDocument doc = XDocument.Load("books.xml");

// Выбор всех заголовков книг
IEnumerable<XElement> titles = doc.XPathSelectElements("//book/title");

foreach (                    

Рекомендаций