OOP Course
Сьогодні

Підрозділ 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-запити працюють нативно на будь-якій колекції вузлів.

XDocument vs XmlDocument — порівняння API

Декларативне створення 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-вираз як аргумент:

LINQ to XML — схема запитів через Descendants та Elements

Розроблено Tomka Yurii · © 2026 ·