Використання xml document object model, КомпьютерПресс

Мова XML все частіше використовується для зберігання інформації, обміну нею між додатками і Web-вузлами. У багатьох додатках ця мова застосовується в якості базового для зберігання даних, в інших - для експортування та імпортування XML-даних. З цього випливає, що розробникам пора задуматися над тим, як можна використовувати XML-дані у власних додатках.

У цій статті ми розглянемо XML Document Object Model (DOM) і її реалізацію фірмою Microsoft - Microsoft XML DOM.

XML DOM - це об'єктна модель, що надає в розпорядження розробника об'єкти для завантаження і обробки XML-файлів. Об'єктна модель складається з наступних основних об'єктів: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap і XMLDOMParseError. Кожен з цих об'єктів (крім XMLDOMParseError) містить властивості та методи, що дозволяють отримувати інформацію про об'єкт, маніпулювати значеннями і структурою об'єкта, а також переміщатися по структурі XML-документа.

Розглянемо основні об'єкти XML DOM і наведемо кілька прикладів їх використання в Borland Delphi.

Використання XML DOM в Borland Delphi

Для того щоб використовувати Microsoft XML DOM в Delphi-додатках, необхідно підключити до проекту відповідну бібліотеку типів. Для цього ми виконуємо команду Project | Import Type Library і в діалогової панелі Import Type Library вибираємо бібліотеку Microsoft XML version 2.0 (Version 2.0), яка зазвичай знаходиться в файлі Windows \ System \ MSXML.DLL

Пристрій XML DOM

Document Object Model представляє XML-документ у вигляді дерева, що складається з гілок. Програмні інтерфейси XML DOM дозволяють додаткам переміщатися по дереву документа і маніпулювати його гілками. Кожна гілка може мати специфічний тип (DOMNodeType), згідно з яким визначаються батьківська і дочірні гілки. У більшості XML-документів можна зустріти гілки типу element, attribute і text. Атрибути (attribute) представляють собою особливий вид гілки і не є дочірніми гілками. Для управління атрибутами використовуються спеціальні методи, що надаються об'єктами XML DOM.

Крім реалізації рекомендованих World Wide Web Consortium (W3C) інтерфейсів, Microsoft XML DOM містить методи, що підтримують XSL, XSL Patterns, Namespaces і типи даних. Наприклад, метод SelectNodes дозволяє використовувати синтаксис шаблонів XSL (XSL Pattern Syntax) для пошуку гілок за певним контексту, а метод TransformNode підтримує використання XSL для виконання трансформацій.

Тестовий XML-документ

Як приклад XML-документа візьмемо каталог музичних CD-ROM, який має наступну структуру:

Тепер ми готові приступити до розгляду об'єктної моделі XML DOM, знайомство з якою почнемо з об'єкта XMLDOMDocument.

XML-документ - об'єкт XMLDOMDocument

Робота з XML-документом починається з його завантаження. Для цього ми використовуємо метод Load, який має всього один параметр, який вказує URL завантажується документа. При завантаженні файлів з локального диска вказується тільки повне ім'я файлу (протокол file: /// в даному випадку можна опустити). Якщо XML-документ зберігається у вигляді рядка, для завантаження такого документа слід використовувати метод LoadXML.

Для управління способом завантаження документа (синхронний або асинхронний) використовується властивість Async. За замовчуванням ця властивість має значення True, вказує на те, що документ завантажується асинхронно і управління повертається додатком ще до повного завантаження документа. В іншому випадку документ завантажується синхронно, і тоді доводиться перевіряти значення властивості ReadyState, щоб дізнатися, завантажився документ чи ні. Також можна створити обробник події OnReadyStateChange, який отримає управління при зміні значення властивості ReadyState.

Нижче показано, як завантажити XML-документ, використовуючи метод Load:

Після того як документ завантажений, ми можемо звернутися до його властивостей. Так, властивість NodeName буде містити значення #document, властивість NodeTypeString - значення document, властивість URL - значення file: /// C: /DATA/DATA.xml.

Обробка ошібoк

Особливий інтерес представляють властивості, пов'язані з обробкою документа при його завантаженні. Так, властивість ParseError повертає об'єкт XMLDOMParseError, що містить інформацію про помилку, що виникла в процесі обробки документа.

Щоб написати обробник помилки, можна додати наступний код:

Щоб дізнатися, яка інформація повертається в разі помилки, змінимо наступний елемент каталогу:

прибравши закриває елемент у другому рядку:</p> <p>Тепер напишемо код, який повертає значення властивостей об'єкта XMLDOMParseError:</p> <p>і виконаємо наше додаток. В результаті отримуємо наступну інформацію про помилку.</p> <p>Як видно з наведеного прикладу, яку повертатимуть об'єктом XMLDOMParseError інформації цілком достатньо для того, щоб локалізувати помилку і зрозуміти причину її виникнення.</p> <p>Тепер відновимо закриває елемент <TITLE> в нашому документі і продовжимо обговорення XML DOM.</p> <h2>Доступ до дерева документа</h2> <p>Для доступу до дерева документа можна або отримати кореневий елемент і потім перебрати його дочірні гілки, або знайти якусь специфічну гілку. У першому випадку ми отримуємо кореневий елемент через властивість DocumentElement, яке повертає об'єкт типу XMLDOMNode. Нижче показано, як скористатися властивістю DocumentElement для того, щоб отримати вміст кожного дочірнього елемента:</p> <p>Для нашого XML-документа ми отримаємо наступний текст.</p> <p>Якщо нас цікавить якась специфічна галузь або гілка рівнем нижче першої дочірньої гілки, ми можемо скористатися або методом NodeFromID, або методом GetElementByTagName об'єкта XMLDOMDocument.</p><p>Метод NodeFromID вимагає вказівки унікального ідентифікатора, визначеного в XML Schema або Document Type Definition (DTD), і повертає гілка з цим ідентифікатором.</p> <p>Метод GetElementByTagName вимагає вказівки рядка зі специфічним елементом (тегом) і повертає всі гілки з даним елементом. Нижче показано, як використовувати даний метод для знаходження всіх виконавців в нашому каталозі CD-ROM:</p> <p>Для нашого XML-документа ми отримаємо наступний текст</p> <p>Відзначимо, що метод SelectNodes об'єкта XMLDOMNode забезпечує більш гнучкий спосіб для доступу до гілок документа. Але про це трохи нижче.</p> <h2>Гілка документа - об'єкт XMLDOMNode</h2> <p>Об'єкт XMLDOMNode є галузь документа. Ми вже стикалися з цим об'єктом, коли отримували кореневий елемент документа:</p> <p>Для отримання інформації про гілки XML-документа можна використовувати властивості об'єкта XMLDOMNode (табл. 1).</p> <h3>Переміщення по дереву документа</h3> <p>Об'єкт XMLDOMNode надає безліч способів для переміщення по дереву документа. Наприклад, для доступу до батьківської гілки використовується властивість ParentNode (тип XMLDOMNode), доступ до дочірніх гілок здійснюється через властивості ChildNodes (тип XMLDOMNodeList), FirstChild і LastChild (тип XMLDOMNode) і т.д. Властивість OwnerDocument повертає об'єкт типу XMLDOMDocument, що ідентифікує сам XML-документ. Перераховані вище властивості дозволяють легко переміщатися по дереву документа.</p> <p>Тепер переберемо всі гілки XML-документа:</p> <p>Як вже зазначалося вище, SelectNodes об'єкта XMLDOMNode забезпечує більш гнучкий спосіб доступу до гілок документа. Крім того, існує метод SelectSingleNode, який повертає тільки першу гілку документа. Обидва ці методи дозволяють задавати XSL-шаблони для пошуку гілок.</p> <p>Розглянемо процес використання методу SelectNodes для вилучення всіх гілок, у яких є гілка CD і гілка PRICE:</p> <p>У колекцію Nodes будуть поміщені всі подветви PRICE гілки CD. До обговорення XSL-шаблонів повернемося трохи пізніше.</p> <h3>Маніпуляція дочірніми гілками</h3> <p>Для маніпуляції дочірніми гілками ми можемо скористатися методами об'єкта XMLDOMNode (табл. 2).</p> <p>Для того щоб повністю видалити запис про першому диску, необхідно виконати наступний код:</p> <p>Зверніть увагу на те, що в даному прикладі ми видаляємо першу дочірню гілку. Як видалити перший елемент першої дочірньої гілки, показано нижче:</p> <p>У наведеному вище прикладі ми видалили не перший гілка <CD>...</CD>, а перший елемент гілки - <TITLE>....

Тепер додамо нову гілку. Нижче наведено код, що показує, як додати новий запис про музичному CD-ROM:

Наведений вище код показує наступну послідовність дій по додаванню нової гілки:

  • Створення нової гілки методом CreateNode:
    • створення елемента методом CreateNode;
    • додавання елемента до гілки методом AppendChild;
    • установка значення елемента через властивість Text;
    • ... повторити для всіх елементів.
  • Додавання нової гілки до документа методом AppendChild.

Нагадаємо, що метод AppendChild додає гілка в кінець дерева. Для того щоб додати гілку в конкретне місце дерева, необхідно використовувати метод InsertBefore.

трансформації

Два методу об'єкта XMLDOMNode - TransformNode і TransformNodeToObject - можуть використовуватися для трансформації гілки в рядок або об'єкт. Ці методи базуються на XSL-синтаксисі.

Набір гілок - об'єкт XMLDOMNodeList

Об'єкт XMLNodeList містить список гілок, який може бути побудований за допомогою методів SelectNodes або GetElementsByTagName, а також отримано з властивості ChildNodes.

Ми вже розглядали використання цього об'єкта в прикладі, наведеному в розділі «Переміщення по дереву документа». Тут же ми наведемо деякі теоретичні зауваження.

Число гілок в списку може бути отримано як значення властивості Length. Гілки мають індекси від 0 до Length-1, і кожна окрема гілка доступна через елемент масиву Item з відповідним індексом.

Переміщення по списку гілок також може здійснюватися за допомогою методу NextNode, що повертає наступну гілку в списку, або Nil, якщо поточна гілка - остання. Щоб повернутися до початку списку, слід викликати метод Reset.

Створення і збереження документів

Отже, ми розглянули, як можна додавати гілки і елементи в існуючі XML-документи. Тепер створимо XML-документ «на льоту». Перш за все нагадаємо, що документ може бути завантажений не тільки з URL, але і зі звичайної рядка. Нижче показано, як створити кореневий елемент, який потім може використовуватися для динамічного побудови інших елементів (що ми вже розглянули в розділі «Маніпуляція дочірніми гілками»):

Після побудови XML-документа збережемо його у файлі за допомогою методу Save. наприклад:

Крім збереження в файлі метод Save дозволяє зберігати XML-документ в новому об'єкті XMLDOMDocument. В цьому випадку відбувається повна обробка документа і, як наслідок, перевірка його структури та синтаксису. Нижче показано, як зберегти документ в іншому об'єкті:

На закінчення відзначимо, що метод Save також дозволяє зберігати XML-документ в інші COM-об'єкти, що підтримують інтерфейси IStream, IPersistStream або IPersistStreamInit.

Використання XSL-шаблонів

Обговорюючи метод SelectNodes об'єкта XMLDOMNode, ми згадали про те, що він забезпечує більш гнучкий спосіб доступу до гілок документа. Гнучкість полягає в тому, що в якості критерію для вибору гілок можна вказати XSL-шаблон. Такі шаблони надають потужний механізм для пошуку інформації в XML-документах. Наприклад, для того, щоб отримати список всіх назв музичних CD-ROM в нашому каталозі, можна виконати наступний запит:

Щоб дізнатися, диски яких виконавців випущені в США, запит формується таким чином:

Нижче показано, як знайти перший диск в каталозі:

Щоб знайти диски Боба Ділана, можна виконати наступний запит:

а щоб отримати список дисків, випущених після 1985 року, ми виконуємо наступний запит:

Використовуючи XSL, ми просто створюємо шаблон (або таблицю стилів), в якому вказуємо, що і як треба перетворити. Потім накладаємо цей шаблон на наш каталог - і готово: перед нами текст XSL-шаблону, що перетворює каталог в таблицю (лістинг 2).

Код для накладення XSL-шаблону на наш каталог виглядає так:

Завершуючи наше обговорення XSL, слід сказати, що в даний час ця мова активно використовується для трансформації між різними XML-документами, а також для форматування документів.

висновок

З цілком зрозумілих причин в одній статті неможливо розглянути всі об'єкти Microsoft XML DOM і навести приклади їх використання. Тут ми лише торкнулися основних питань використання XML DOM в додатках. У табл. 3 показані всі об'єкти, реалізовані в Microsoft XML DOM.

Зовсім недавно компанія Cougar представила нову серію блоків живлення для традиційних ПК - VTX, орієнтовану на користувачів з обмеженим бюджетом. У цьому огляді буде розглянута модель Cougar VTX600, яка завдяки своїм характеристикам буде однією з найбільш затребуваних в цій лінійці блоків живлення

На щорічному заході Capsaicin SIGGRAPH в Лос-Анджелесі компанія AMD зміцнила свої позиції на ринку ПК класу high-end з новими процесорами Ryzen Threadripper і GPU «Vega»

Для простого і зручного побудови мереж рядовими користувачами компанія ZyXEL випустила чергову версію свого Інтернет-центру для підключення до мереж 3G / 4G через USB-модем з точкою доступу Wi-Fi - ZyXEL Keenetic 4G III, який ми і розглянемо в цьому огляді

До своєї і так великій родині роутерів і маршрутизаторів фірма ASUS недавно додала дві вельми цікаві моделі: флагманську 4G-AC55U і більш просту 4G-N12. У даній статті буде розглянута флагманська модель ASUS 4G-AC55U

Молода, але амбіційна компанія KREZ на початку цього року випустила нову, оригінальну модель ноутбука KREZ Ninja (модель TM1102B32) під керуванням Windows 10. Оскільки цей комп'ютер має поворотний екран, він може служити універсальним рішенням - його можна з успіхом використовувати і для роботи, і для навчання, і для ігор

Якщо ви часто друкуєте фотографії та вже втомилися міняти картриджі в своєму принтері, зверніть увагу на МФУ Epson L850. Великий ресурс витратних матеріалів, чудова якість відбитків, найширший набір функціональних можливостей - ось лише деякі з переваг даної моделі