Работа с XML в C# (.NET): Полное руководство для начинающих

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

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

Начать курс

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

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

1. Классический подход: XmlDocument

System.Xml.XmlDocument — это DOM-модель (Document Object Model), которая загружает весь XML-документ в память в виде дерева узлов. Этот подход знаком разработчикам со времён .NET Framework 1.0.

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

using System.Xml;

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

// Получаем корневой элемент
XmlElement root = doc.DocumentElement;

// Обход всех дочерних узлов
foreach (XmlNode node in root.ChildNodes)
{
    if (node.Name == "book")
    {
        string title = node["title"]?.InnerText;
        string author = node["author"]?.InnerText;
        Console.WriteLine($"Книга: {title}, Автор: {author}");
    }
}

Создание и запись XML

XmlDocument newDoc = new XmlDocument();
XmlElement rootElem = newDoc.CreateElement("library");
newDoc.AppendChild(rootElem);

XmlElement book = newDoc.CreateElement("book");
rootElem.AppendChild(book);

XmlElement title = newDoc.CreateElement("title");
title.InnerText = "Мастер и Маргарита";
book.AppendChild(title);

newDoc.Save("library.xml");

Плюсы: Простота, поддержка XPath, полный контроль над DOM.
Минусы: Потребляет много памяти, нет поддержки LINQ.

2. Современный подход: LINQ to XML (XDocument)

Начиная с .NET 3.5, рекомендуется использовать пространство имён System.Xml.Linq. Классы XDocument, XElement и XAttribute предоставляют более лёгкий и функциональный API с полной интеграцией с LINQ.

Чтение XML с помощью XDocument

using System.Xml.Linq;

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

var books = xdoc.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.Author} ({book.Year})");
}

Создание XML с помощью XElement

XDocument xdoc = new XDocument(
    new XElement("library",
        new XElement("book",
            new XElement("title", "Преступление и наказание"),
            new XElement("author", "Ф.М. Достоевский"),
            new XAttribute("id", "1")
        )
    )
);

xdoc.Save("library2.xml");

Плюсы: Лаконичный синтаксис, поддержка LINQ, меньший расход памяти.
Минусы: Может быть непривычен для разработчиков, привыкших к DOM.

3. Сериализация объектов в XML: XmlSerializer

Если у вас есть классы C#, вы можете автоматически преобразовывать их в XML и обратно с помощью System.Xml.Serialization.XmlSerializer.

Пример класса для сериализации

[Serializable]
public class Book
{
    [XmlAttribute("id")]
    public int Id { get; set; }

    [XmlElement("title")]
    public string Title { get; set; }

    [XmlElement("author")]
    public string Author { get; set; }

    [XmlIgnore]
    public string InternalNote { get; set; }
}

Сериализация (объект → XML)

using System.Xml.Serialization;
using System.IO;

Book book = new Book 
{ 
    Id = 1, 
    Title = "Война и мир", 
    Author = "Л.Н. Толстой" 
};

XmlSerializer serializer = new XmlSerializer(typeof(Book));

using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer, book);
    string xml = writer.ToString();
    Console.WriteLine(xml);
}

Десериализация (XML → объект)

string xmlString = @"<Book id='1'>
    <title>Война и мир</title>
    <author>Л.Н. Толстой</author>
</Book>";

using (StringReader reader = new StringReader(xmlString))
{
    Book deserializedBook = (Book)serializer.Deserialize(reader);
    Console.WriteLine(deserializedBook.Title);
}

Плюсы: Автоматическая конвертация, поддержка атрибутов, удобно для конфигураций и API.
Минусы: Т

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