Работа с 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 (