Підрозділ 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 читання
XmlReader рухається по XML в одному напрямку — вперед. Не можна повернутися до попереднього вузла (на відміну від DOM). Кожен виклик Read() просуває позицію на наступний вузол і встановлює NodeType.
Базове читання
reader.Depth показує рівень вкладеності поточного вузла — зручно для відступів. reader.IsEmptyElement — true для <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 будь-якого розміру при константному використанні пам'яті:
