OOP Course
Сьогодні

Підрозділ 19.4

XmlReader та XmlWriter. Потоковий XML

19.4. XmlReader та XmlWriter. Потоковий XML XmlDocument і XDocument зручні, але мають спільний недолік: вони завантажують весь XML документ у пам'ять як дерево об'єктів. Для файлу в 10 MB це прийнятно. Для XML

19.4. XmlReader та XmlWriter. Потоковий XML

XmlDocument і XDocument зручні, але мають спільний недолік: вони завантажують весь XML-документ у пам'ять як дерево об'єктів. Для файлу в 10 MB це прийнятно. Для XML-експорту з 500 000 лабораторних результатів, XML-архіву DICOM-даних або потоку HL7-повідомлень — DOM-підхід призведе до OutOfMemoryException або неприйнятного часу завантаження.

XmlReader і XmlWriter реалізують потоковий (streaming) підхід: читання і запис відбуваються послідовно, вузол за вузлом, без побудови повного дерева в пам'яті. Використання пам'яті константне незалежно від розміру файлу — тільки один поточний вузол.

XmlReader — forward-only потокове читання XML

XmlReader — forward-only читання

XmlReader рухається по XML в одному напрямку — вперед. Не можна повернутися до попереднього вузла (на відміну від DOM). Кожен виклик Read() просуває позицію на наступний вузол і встановлює NodeType.

Базове читання

reader.Depth показує рівень вкладеності поточного вузла — зручно для відступів. reader.IsEmptyElementtrue для <tag/> без вмісту.

ReadToFollowing, ReadElementContentAsString та GetAttribute

Метод Опис
Read() Наступний вузол; false = кінець
ReadToFollowing("name") Перемотати до наступного елемента з назвою
ReadToDescendant("name") Перемотати до першого дочірнього
ReadToNextSibling("name") Перемотати до сусіднього на тому ж рівні
ReadElementContentAsString() Прочитати текст і перейти за </tag>
ReadElementContentAsInt() Те саме для int
ReadElementContentAsDouble() Те саме для double
GetAttribute("name") Атрибут поточного Element-вузла
Skip() Пропустити поточний елемент з усіма дочірніми

Обробка великого XML-файлу потоково

XmlWriter — потоковий запис XML

XmlWriter записує XML послідовно — елемент за елементом. Він гарантує синтаксичну коректність: відкритий тег без WriteEndElement призведе до помилки при Dispose.

Базовий запис

Серіалізація колекції у XML через XmlWriter

XmlReader + XmlWriter: трансформація великих файлів

Найпотужніший патерн — читати через XmlReader і одночасно писати через XmlWriter. Це дозволяє трансформувати XML будь-якого розміру при константному використанні пам'яті:

XmlWriter — послідовний запис елементів і атрибутів

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