Являє інструкцію обробки
Таблиця 1. Об'єкти XML DOM і їх використання
Іноді це може збивати з пантелику, але об'єкти XML-документа можуть бути (і часто бувають) поліморфними. Так, вузол (Node) в той же самий час є елементом (Element). Це вносить плутанину, коли ви вирішуєте, який об'єкт DOM потрібний для здійснення певної дії. Ви створюєте вузли, використовуючи об'єкт документа (Document), але якщо вам потрібно додати атрибути до щойно створеного вузла, вам доведеться попрацювати з ним як з одним з елементів. Якщо у відносинах між об'єктами і діями над ними і існує якась закономірність, мені поки не вдалося відкрити її в процесі щоденної роботи. Я постійно звертаюся до документації в MSDN, щоб подивитися, який інтерфейс надає методи, потрібні мені для вирішення того чи іншого завдання. Методи різних об'єктів логічно згруповані, і, мабуть, саме цей принцип (угруповання логічно пов'язаних операцій) був використаний при проектуванні DOM.
Таким чином, весь фокус полягає в тому, щоб отримати у парсеру MSXML потрібний DOM-об'єкт, реалізацію якого надає об'єкт COM. Звичайна послідовність дій має на увазі створення COM-об'єкта самого MSXML, у якого потім можна запросити (або отримати якимось іншим способом) покажчики на інші об'єкти XML DOM (які в свою чергу теж є COM-об'єктами).
Демонстраційне додаток, що використовує XML DOM
Створити неймовірне додаток, що використовує безліч різних можливостей MSXML, зовсім не складно, але зайвий код може тільки додати плутанини. Тому я вирішив написати просте консольний додаток, яке виконує чотири основних операції:
- Завантажує XML-файл з диска.
- Відшукує певний вузол і додає до нього дочірній вузол.
- Знаходить ще один вузол і відображає міститься в ньому текст.
- Зберігає змінений документ на диск.
Щоб ще більше спростити завдання, я жорстко "зашив" в програму імена XML-файлів і вузлів. Зрозуміло, що в реальному додатку ви навряд чи застосуєте цю тактику. Але в нашому випадку вона має сенс, тому що ще більше спрощує код, пов'язаний з використанням MSXML.
Як і в багатьох інших випадках, я використовував в своєму прикладі бібліотеку ATL як зручну обгортку для всіх операцій, пов'язаних з COM. Тому ви неодмінно побачите, як я використовую об'єкти CComPtr і CComQIPtr. Для рівного рахунку я додав до них також об'єкти CComBSTR і CComVariant. Якщо вони вам не знайомі, просто запам'ятайте, що вони є шаблонами і самі дбають про багатьох деталях, які для наших цілей несуттєві. Для нас важливо розглянути, яким чином шукати вузли XML, додавати нові вузли і відображати міститься в них текст.
Моє консольний додаток буде завантажувати XML-документ під назвою xmldata.xml (передбачається, що він лежить в одному каталозі з виконуваним файлом), що містить наступні дані: