Підрозділ 19.3
XDocument та LINQ to XML
19.3. XDocument та LINQ to XML XmlDocument з'явився у .NET 1.0 і повністю реалізує стандарт DOM рівня 1. Але його API проектувався за зразком Java DOM і є досить багатослівним: щоб додати один елемент, потрібно
19.3. XDocument та LINQ to XML
XmlDocument з'явився у .NET 1.0 і повністю реалізує стандарт DOM рівня 1. Але його API проектувався за зразком Java DOM і є досить багатослівним: щоб додати один елемент, потрібно викликати CreateElement, SetAttribute, AppendChild — три окремих виклики. Навігація потребує явного приведення типів. А LINQ-запити до XmlNodeList — неможливі без ручного перебору.
.NET 3.5 разом із LINQ представив принципово інший підхід: System.Xml.Linq. Класи XDocument, XElement, XAttribute проектувалися з нуля під функціональний стиль і LINQ. Результат — код у 2–4 рази коротший, XML будується декларативно (через вкладені конструктори), а LINQ-запити працюють нативно на будь-якій колекції вузлів.

Декларативне створення XML через XElement
Ключова перевага XDocument/XElement — вкладений конструктор. XML будується в точності так, як він виглядає: вкладені теги = вкладені об'єкти:
Порівняйте: у XmlDocument той самий документ потребував би близько 40 рядків з явними CreateElement/AppendChild. Тут вся структура видна одним поглядом.
Збереження та завантаження
Навігація по документу
| Метод | Що повертає |
|---|---|
Element("name") |
Перший прямий дочірній XElement з такою назвою |
Elements("name") |
Всі прямі дочірні XElement з такою назвою |
Elements() |
Всі прямі дочірні XElement |
Descendants("name") |
Всі нащадки з назвою (будь-яка глибина) |
Descendants() |
Всі нащадки |
Ancestors("name") |
Всі батьківські вузли з назвою (вгору) |
Attribute("name") |
XAttribute або null |
Attributes() |
Всі атрибути |
LINQ-запити до XML
Найсильніша сторона XDocument — нативна інтеграція з LINQ. Будь-який метод, що повертає IEnumerable<XElement>, можна фільтрувати, трансформувати, групувати через Where, Select, GroupBy, OrderBy:
Зміна документа
SetAttributeValue — зручний метод: якщо атрибут існує — оновлює значення, не існує — додає. При значенні null — видаляє атрибут. SetValue — аналогічно для текстового вмісту елемента.
Генерація XML з колекцій C#
Особливо зручно використовувати конструктор XElement з IEnumerable<XElement> — можна передавати LINQ-вираз як аргумент:
