Работа с 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.
Минусы: Т
Также в библиотеке
Планировщик задач Swift: GCD, OperationQueue и Combine для iOS/macOS
Валидация данных в TypeScript: библиотеки, подходы и примеры кода
RxJava для Java: полное руководство с примерами
HTTP-клиент для Swift (iOS/macOS): топ библиотек для работы с сетью
Byte Buddy для Java: полное руководство с примерами