Журнал ВРМ World

Мировая история развития технологий управления эффективностью бизнеса – обзоры зарубежных публикаций

DOM для Web-сервисов, часть 1

Вторая статья знакомит с основами модели DOM с точки зрения ее использования
в Web-сервисах. Особое внимание уделено требованиям, предъявляемым приложениями
Web-сервисов к составлению и обработке XML-документов.

В этой статье (являющейся первой в цикле статей, состоящих из трех частей) рассказывается о модель DOM (Document Object Model, объектная модель документов), причем особое внимание уделено вопросам ее применения в Web-сервисах. В ней демонстрируются возможности модели DOM с точки зрения требований, предъявляемых приложениями Web-сервисов к составлению и обработке XML-документов. В статье рассматривается каждый из трех уровней DOM, а также объясняется как, когда и зачем использовать разнообразные функциональные возможности, которые предлагает DOM. Каждый уровень DOM предоставляет определенный набор функциональности для составления и обработки XML-документов. DOM уровня 1 и 2 - это рекомендации консорциума W3C, уровень 3 - это пока рабочий проект.

Первая статья состоит из двух частей: в первой рассказывается о требованиях, предъявляемых Web-сервисами к составлению и обработке XML-документов, во второй - о DOM и двух реализациях этой модели: Microsoft XML (MSXML) и Xerces.

Стоит заметить, что автор признает, что DOM не всегда единственный или лучший способ обработки XML-документа или Web-сервисов, но эта модель обладает преимуществами с точки зрения широкой распространенности и применимости.

Требования, предъявляемые к Web-сервисами составлению и обработке XML-документов

Листинг 1 представляет собой простой WSDL-файл (Web Services Description Language, Язык описания Web-сервисов). Предназначение WSDL - определить синтаксис для описания интерфейсов Web-сервисов. Этот синтаксис включает три основных компонента: имя метода запроса, параметры, которые передаются вместе с запросом, и детальная информация о сообщении, которое Web-сервис отправит в ответ. Более подробное объяснение WSDL можно получить, прочитав статьи, опубликованные на WebServices.XML.com.

Описание на языке WSDL можно обработать, чтобы получить HTML-представление, необходимое для обеспечения взаимодействия человека с Web-сервисах, а также чтобы сгенерировать SOAP-сообщения, которые будут взаимодействовать с сервером SOAP.

Листинг 2 - это простой HTML-файл, полученный из WSDL-файла, представленного в Листинге 1. На данном этапе рассмотрение ограничивается объяснением требований, предъявляемых к составлению и обработке XML-документов при преобразовании WSDL-файла в HTML-файл с целью представления пользователям Web-сервиса. Далее будет показано, как это выполняется с помощью интерфейсов прикладного программирования (API) DOM.

Стоит обратить внимание на следующие моменты, касающиеся преобразования WSDL в HTML:

  1. В HTML-файле содержатся абзац (элемент p) и таблица.
  2. Абзац включает заголовок (элемент h3) и предложение.
  3. Строка "WeatherService", находящаяся внутри элемента h3, соответствует значению атрибута name элемента service в Листинге 1. Стоит напомнить, что значение атрибута name элемента service - это имя сервиса. Именно поэтому это имя использовано в качестве заголовка страницы вызова Web-сервиса.
  4. Аналогичным образом из WSDL-файла было скопировано описание Web-сервиса и добавлено сразу после заголовка в HTML-файле.
  5. Таблица в HTML-файле Листинга 2 содержит форму, которая в свою очередь включает ряд строк.
  6. Первая и вторая строки содержат имя и описание метода запроса GetCityWeatherReport. Данная информация также получена копированием из соответствующих элементов WSDL-файла Листинга 1.
  7. Кроме того, таблица включает элемент input, представляющий параметр, который данный метод запроса принимает для вызова метода Web-сервиса GetCityWeatherReport. От пользователя потребуется ввести имя города, для которого необходимо получить прогноз погоды.

Таким образом, HTML-файл Листинга 2 получен из WSDL-файла Листинга 1 с целью обеспечения взаимодействия человека с Web-сервисом. Аналогичным образом можно составить запрос SOAP, считав данные из WSDL-файла.

Рассмотрим Листинг 3, являющийся SOAP-сообщением, которое передает запрос на вызов метода GetCityWeatherReport в обсуждаемый Web-сервис. Следует обратить особое внимание на следующие моменты:

  1. Имя этого метода (GetCityWeatherReport), определенное в WSDL-файле, становится именем непосредственного потомка элемента SOAP Body.
  2. Пользователю, который пожелает вызвать этот Web-сервис, потребуется предоставить значение параметра CityName (элемент part внутри первого элемента message в Листинге 1). Это значение оказывается внутри элемента в Листинге 3. Стоит заметить, что значение атрибута name (CityName) элемента part в Листинге 1 становится именем элемента в запросе SOAP Листинга 3.

Цель данного описания преобразования из WSDL в HTML и составления SOAP-сообщения - предоставить общее представление о требованиях, предъявляемых Web-сервисами к обработке XML-документов. Такой тип преобразований может быть осуществлен различными способами, в том числе и с использованием DOM.

При использовании DOM имеется возможность воспользоваться реализацией DOM как с клиентской стороны, так и с серверной. DOM с клиентской стороны исполняется внутри браузера, а DOM с серверной стороны находится в Web-сервере. В случае использования DOM с клиентской стороны в браузер отправляется WSDL-файл, аналогичный рассмотренному выше, вместе с необходимым скриптом (например JavaScript), который воспользуется реализацией DOM этого браузера, чтобы составить HTML и SOAP.

С другой стороны, в случае использования DOM с серверной стороны, Web-сервер воспользуется своей реализацией DOM, чтобы составить HTML и SOAP.

В этом цикле статей будет показано использование реализаций DOM как с клиентской стороны, так и с серверной. Именно тогда будут рассмотрены интерфейсы прикладного программирования DOM. Следующий же раздел посвящен DOM и двум наиболее важным реализациям DOM: MSXML и Xerces.

Объектная модель документов

DOM представляет XML-документ в виде дерева, состоящего из узлов. В DOM определяются различные типы узлов, соответствующие разным конструкциям XML. Например, XML-элемент - это узел элемента, пара атрибут XML и его значение - это узел атрибута, содержание элемента - это текстовый узел и т.д.

XML-документ может быть загружен в дерево узлов DOM. На рис. 1 показан фрагмент представления DOM для Листинга 1. Все узлы элементов изображены зеленым цветом, а все узлы атрибутов - синим.



Рис. 1. Представления фрагмента DOM для Листинга 1

Узлы модели DOM связаны между собой отношениями родитель-потомок или сестринский узел. Например, как следует из рис. 1, элементы message и portType являются потомками элемента definitions и элементами одного уровня. Стоит заметить, что узел document, изображенный на рис. 1, это родитель корневого узла (definitions), что означает, что все узлы в модели DOM являются прямыми или косвенными потомками узла document.

Интерфейсы DOM используют понятие наследования, определенное в объектно-ориентированном программировании. Так, различные типы узлов (таких как узел элемента, узел атрибута, текстовый узел) наследуется из родового интерфейса Node.

Эта древовидная структура DOM является объектно-ориентированной, а это означает, что различные типы узлов, показанных на рис. 1, это не просто структуры данных. Каждый узел - это объект, который содержит и данные, и методы для манипулирования этим объектом. Например, можно взять узел definitions и вызвать его методы, чтобы получить список узлов элементов-потомков этого узла. Затем можно взять отдельный элемент-потомок и вызвать его методы, чтобы пойти дальше по дереву DOM. Таким образом можно обойти весь документ DOM.

Для реализации вышесказанного в спецификации DOM для различных типов узлов определены программные интерфейсы для вызова их функциональности. Воспользовавшись этими программными интерфейсами DOM, можно выполнить все рассмотренные выше требования, предъявляемые Web-сервисами к составлению и обработке XML-документов. Для этого необходимо взять WSDL-файл, загрузить его в документ DOM, а затем воспользоваться различными интерфейсами DOM для составления и обработки XML-документов.

Если вспомнить о рассмотренной в предыдущем разделе генерации HTML-страниц из WSDL-файлов, то для таких задач DOM предоставляет HTML-интерфейс, который специально спроектирован для составления и обработки HTML-документов. Следовательно, в этом случае можно загрузить WSDL-файл в документ DOM, считать информацию из WSDL-файла и составить HTML-документ, используя интерфейс DOM, предназначенный для HTML.

От уровня 1 к уровню 3

При разработке спецификации DOM специалисты международного консорциума W3C классифицировали эту модель по уровням. Уровень 1 включал базовые функциональные возможности по обработке XML-документов, как, например, обход по структуре XML-файла, получение всех потомков отдельного узла, проверка типа узла (является ли он узлом элемента или узлом атрибута или же каким-либо другим типом узла), задание и чтение атрибутов отдельного узла элемента, переход к следующему или предыдущему сестринскому узлу отдельного узла, добавление или удаление атрибутов отдельного узла элемента, добавление нового потомка к узлу, получение списка всех элементов с определенным именем, работа с инструкциями обработки XML и т.д.

Помимо этой XML-функциональности, DOM уровня 1 также содержит ряд специальных интерфейсов, которые могут обрабатывать отдельные HTML-элементы. Например, в DOM уровня 1 можно работать с таблицами HTML, формами, списками выбора и т.д.

В DOM уровня 2 были добавлены несколько новых возможностей, например, в DOM уровня 1 отсутствовала поддержка пространств имен. Поэтому для работы с несколькими пространствами имен в одном документе DOM уровня 1 требовалось написание собственной программной логики для управления URIs (Uniform Resource Identifier, универсальный идентификатор ресурса) пространств имен, префиксами и именами элементов. Интерфейсы DOM уровня 2 содержат методы для управления пространствами имен, связанными с требованиями к составлению и обработке XML-документов.

DOM уровня 3 - это рабочий проект спецификации, которая расширяет функциональность DOM уровня 2. Одна из наиболее важных особенностей этой версии спецификации заключается в возможности работать с многочисленными расширениями DOM, предназначенными для схемы.

Например, для собственных XML-словарей можно определять программные интерфейсы, предназначенные для схемы, подобно HTML-интерфейсам DOM уровня 1. В этом случае разрабатывается высокоуровневый программный интерфейс для манипулирования XML-документами в соответствии с собственной схемой. Аналогичным образом многие компании предложат свои собственные специализированные интерфейсы для составления и обработки XML-файлов, которые все вместе могут быть реализованы с использованием интерфейсов DOM на более низком уровне.

Иногда такие предназначенные для схемы интерфейсы потребуются для использования в одном приложении вместе со стандартными интерфейсами DOM. DOM уровня 3 предоставляет механизм для разработки предназначенных для схемы интерфейсов в качестве расширения DOM и совместного использования различных расширений DOM в одном приложении.

Для приложений Web-сервисов характерно использование различных пространств имен в одном и том же интерфейсе Web-сервиса на основе WSDL. Таким образом, предназначенные для схемы интерфейсы DOM могут быть разработаны и использованы вместе в отдельном приложении Web-сервиса. Эта концепция будет рассмотрена во второй и третьей статье этой серии.

MSXML

В MSXML, предлагаемом Microsoft, реализованы интерфейсы DOM уровня 2. Помимо этого, MSXML добавляет некоторые расширенные функциональные возможности, не присутствующие в DOM уровня 2.

Ниже приведены некоторые интерфейсы DOM уровня 2, реализованные в MSXML:

  1. Интерфейс IXMLDOMNode - это родовой узел DOM, от которого расширяются все различные типы узлов. Использование этого интерфейса напрямую не рекомендуется, вместо этого используются различные типы узлов (например, узел элемента, узел атрибута и т.д.), которые расширяются из интерфейса IXMLDOMNode.
  2. Интерфейс IXMLDOMDocument предоставляет функциональность узла документа, который содержит весь документ DOM в качестве своих прямых или косвенных потомков. Как правило, составление и обработка XML-документа начинается с этого интерфейса.
  3. Интерфейс IXMLDOMElement определяет функциональность узла элемента DOM. Например, он располагает методами для получения списка атрибутов, связанных с элементом, или значения отдельного атрибута и т.д.
  4. Интерфейс IXMLDOMNodeList предназначен для манипулирования списком узлов DOM (таких как все узлы элементов-потомков XML-элемента). Этот интерфейс включает методы для обхода по списку элементов-потомков и отыскания определенного узла в этом списке.
  5. Интерфейс IXMLDOMText предоставляет методы для манипулирования текстовым содержанием XML-элемента.
  6. Интерфейс IXMLDOMComment> используется для работы с комментариями в XML-файле.
  7. Интерфейс IXMLDOMAttribute предоставляет функциональность узла атрибута (например, для редактирования значения атрибута).

Помимо этого, MSXML реализует HTML-интерфейсы DOM, для составления и обработки HTML-документов. Эти HTML-интерфейсы предоставляют простые методы для наполнения тела (body) HTML-документа с <a>, <p>, <table>, <form>, <input> и другими HTML-элементами.

MSXML может быть использован как на клиентской, так и серверной сторонах. На клиентской стороне MSXML должен быть использован внутри Microsoft Internet Explorer. Например, для получения HTML-файла Листинга 2 из WSDL-файла Листинга 1 можно сгенерировать JavaScript с серверной стороны, который будет использовать MSXML для создания HTML-документа на клиентской стороне.

Альтернативный вариант - прямая генерация HTML-документа на клиентской стороне с использованием тех же самых возможностей DOM в MSXML.

Рассмотрим Листинг 4, который предназначен для знакомства с обработкой XML-документа в MSXML. Листинг 4 - это фактически HTML-файл с простым методом JavaScript FindServiceDocumentation, который считывает содержание элемента documentation, находящегося в элементе service Листинга 1, и выдает пользователю комментарии в виде предупреждения браузера.

Ниже кратко объясняется, как метод FindServiceDocumentation Листинга 4 работает с MSXML:

  1. Первая строка в методе FindServiceDocumentation создает экземпляр объекта MSXML.
  2. Вторая, третья и четвертая строки кода метода - это объявления переменных, которые будут использованы для хранения различных узлов элементов DOM.
  3. Пятая строка (xmlDoc.load) загружает WSDL-файл в DOM.
  4. Следующая строка - это условный оператор (if), который проверяет, имели ли место ошибки во время загрузки XML-документа. Наиболее вероятная ошибка - это ошибка, возникающая при попытке загрузить в DOM некорректно оформленный XML-документ.
  5. Если при загрузке XML-документа в DOM не возникло никаких проблем, читается корневой элемент и проверяется, является ли он definitions. Если это не definitions, дальнейшая обработка не нужна.
  6. Если же корневой элемент definitions, начинается поиск элемента service. Стоит заметить, что строка serviceElement = definitionsElement.getElementsByTagName("service").item(0) фактически исполняется за два шага. Сначала getElementsByTagName возвращает список всех элементов service, а затем метод item(0) выдает первый элемент из этого списка.
  7. Аналогичным образом считывается элемент documentation в элементе service.
  8. Перейдем к строке alert, которая содержит вызов метода documentationElement.firstChild.nodeValue. Этот метод выполняется за два шага. Вызов метода documentationElement.firstChild выбирает первый узел-потомок элемента documentation. Первый потомок элемента documentation - это требуемый текстовый узел, который разыскивался. Свойство nodeValue возвращает значение текстового узла в виде текстовой строки. Оператор предупреждения отображает эту текстовую строку в качестве предупреждения.

Листинг 4, как и последующее объяснение, очень просты и кратки, поскольку это всего лишь предварительное знакомство с MSXML. Реальное составление и обработка XML-документов гораздо сложнее. Приведенный здесь пример будет фигурировать и во второй статье, также будет детально рассмотрено использование MSXML как для составления, так и обработки и HTML-, и XML-документов.

Xerces

Xerces - это реализация DOM уровня 2 на основе языка Java, разработанная корпорацией Apache. Xerces также частично поддерживает DOM уровня 3. Используя Xerces можно создавать клиентские приложения SOAP на основе языка Java, хотя в основном Xerces применяется на серверной стороне.

Интерфейсы Xerces, как и следовало ожидать, подобны интерфейсам MSXML, поскольку оба продукта являются реализациями DOM.

В третьей статье этой серии будет детально рассмотрено использование Xerces. На данном этапе кратко перечислим следующие особенности Xerces:

  1. Почти все интерфейсы происходят из интерфейса Node.
  2. Интерфейс Document позволяет манипулировать всем XML-документом. Как правило, для получения корневого элемента XML-документа используется этот интерфейс. Этим интерфейсом также можно воспользоваться, чтобы импортировать узел из каких-либо других документов DOM в этот документ.
  3. Интерфейс Element позволяет обрабатывать или составлять элементы (например, добавлять атрибуты к элементу или удалять их из него).
  4. Интерфейс NodeList используется для манипулирования списком узлов.

Данная статья - кратное знакомство с MSXML и Xerces. Во второй статье будет продемонстрировано использование MSXML, а в третье - Xerces. И во второй, и в третьей статьях модели применения Web-сервисов, а также требования, предъявляемые к составлению и обработке XML-документов, будут представлены в качестве сценариев использования для приложений с целью демонстрации возможностей DOM.

Ресурсы

  • Главная страница DOM на сайте консорциума W3C.
  • Информация о последних разработках DOM уровня 3 на странице DOM Level-3 Core.
  • Страницы WSDL 1.2 и SOAP Primer на сайте консорциума W3C.
  • Серия статей (Часть 1, 2 и 3), рассказывающая об основах Web-сервисов, включая WSDL и SOAP.
  • Спецификация консорциума W3C "Типы данных XML-схемы" (XML Schema Data types).
  • Статья, в которой показано, как создавать собственные упрощенные парсеры XML DOM.

Автор: Дэар Обасаньо (Dare Obasanjo)