Журнал ВРМ World

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

DOM Level 3 Core: отличительные особенности, часть 2

Весной этого года произошло достаточно знаменательное событие в области
стандартизации: Рабочая группа международного консорциума W3C, занимающая
разработкой модели DOM (Document Object Model, Объектная модель документов),
выпустила несколько спецификаций DOM.
Одной их самых последних работ W3C - Рабочей версии спецификации "Document
Object Model (DOM) Level 3 Core" (Объектная модель документа, Уровень 3,
Основные положения) - была посвящена серия статей, опубликованных в популярном
ресурсе Developerworks. В
первой статье
(Discover
key features of DOM Level 3 Core, Part 1) рассказывалось о том, как
управлять узлами и текстом и как добавлять пользовательские данные к узлам. В
предлагаемой вашему вниманию второй и заключительной части этой серии
публикаций рассматриваются операции над документом, объясняется, как проверять
в памяти документ на предмет его соответствия схеме и как получать информацию о
типах элементов и атрибутов.

Самонастройка, преобразование в XML Infoset, получение информации о типах и работа с Xerces

В этой серии статей описываются некоторые ключевые особенности Рабочей версии стандарта консорциума W3C "Document Object Model (DOM) Level 3 Core" (Объектная модель документа, Уровень 3, Основные положения), на примерах кода Java объясняется, как их использовать. Во второй и заключительной части авторы рассматривают операции над документом, получение информации о типах и знакомят с первыми реализациями этого API (интерфейса прикладного программирования) в проекта Apache Xerces2.

В первой части были представлены некоторые особенностей DOM Level 3 Core, которыми можно воспользоваться при работе с узлами. В этой статье рассказывается о том, как преобразовывать модель данных DOM в XML Infoset и как с помощью так называемого механизма самонастройки DOM (DOM bootstrapping mechanism) удалять из приложения зависящий от реализации код. Кроме того, в ней показано, как перепроверять в памяти документ на предмет его соответствия схеме, как получать информацию о типах элементов и атрибутов и как использовать все эти замечательные возможности в Xerces.

Преобразование в XML Infoset

Одна из важнейших задач, которая была реализована в DOM Level 3 - это приведение модели данных DOM к XML Information Set (Infoset). Для этого были добавлены новые методы, предназначенные для получения недостающей информации о XML Infoset. Теперь можно, например, запрашивать и модифицировать информацию, хранящуюся в объявлении XML, такую как version, standalone и encoding, через интерфейс Document (который преобразуется в информационную единицу документ Infoset). Аналогично, свойства: базовый URI (base URI) и базовый URI объявления (declaration base URI) - вычисляются согласно XML Base и доступны по интерфейсу Node. Также можно извлекать свойство "свободное место содержания элемента XML Infoset" (XML Infoset element content whitespace property). Это свойство указывает, содержит ли узел только свободное место, которое можно игнорировать. Данное свойство можно извлечь через интерфейс Text (который преобразуется в информационную единицу символ Infoset). В Листинге 1 показаны реальные сигнатуры метода в этом интерфейсе при связывании на языке Java.

Листинг 1. Сигнатуры метода при связывании на языке Java

// XML Declaration information on
// the org.w3c.dom.Document interface
public String getXmlEncoding();
public void setXmlEncoding(String xmlEncoding);
public boolean getXmlStandalone();
public void setXmlStandalone(boolean xmlStandalone)
                                  throws DOMException;
public String getXmlVersion();
public void setXmlVersion(String xmlVersion)
                                  throws DOMException;

// element content whitespace property on the Text 
// interface
public boolean isWhitespaceInElementContent();

Кроме того, можно извлекать значение свойства "тип атрибута информационной единицы атрибут" (это тип атрибута) через атрибут schemaTypeInfo интерфейса Attr. Более подробно об этом написано ниже.

Помимо этого, новая функциональность позволяет вернуть Document в форму, наиболее близкую к XML Infoset, поскольку различные операции редактирования, как, например, вставка или удаление узла, часто могут привести к тому, что документ окажется более далеким от XML Infoset, чем он мог бы быть. Для этого, и для других задач, применяется операция нормализации документа (document normalization), о которой будет рассказано в одноименном разделе.

Наконец, в обновленном Приложении С приведены преобразования между моделью XML Infoset и DOM, где каждая информационная единица XML Infoset преобразуется в соответствующий атрибут Node и, наоборот, и каждое свойство информационной единицы преобразуется в соответствующий атрибут Node. Прочитав это приложение, можно получить достаточное общее представление о модели данных DOM и понять, как находить необходимую информацию.

Самонастройка

Предыдущие версии спецификации DOM не предоставляли возможность самонастройки реализаций DOM; по этой причине разработка приложений начиналась с зависящего от реализации кода. В спецификации DOM Level 3 Core определен объект DOMImplementationRegistry, который позволяет находить реализации в соответствии с требуемой функциональностью. Предположим, что необходима реализация, которая поддерживает изменяющиеся события. Листинг 2 демонстрирует, как можно использовать механизм самонастройки в приложении, чтобы найти подходящую реализацию.

Листинг 2. Использование самонастройки для нахождения реализации

// set DOMImplementationRegistry.PROPERTY property 
// to reference all known DOM implementations

System.setProperty(DOMImplementationRegistry.PROPERTY,
                   "org.apache.xerces.dom.DOMImplementationSourceImpl");

// get an instance of DOMImplementationRegistry
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();

// DOM implementation that support the specified features
DOMImplementation i = registry.getDOMImplementation("MutationEvent");

Самонастройка обладает многочисленными достоинствами - она не только делает возможным получение кода, независящего от реализации, но и позволяет разработчикам DOM предоставлять реализации, которые лучше отвечают потребностям пользователя. В результате, повышается производительность приложений. Например, у Xerces несколько реализаций: одна полнофункциональная, поддерживающая множество факультативных модулей DOM, другая - минимальная, поддерживающая только базовую функциональность для более легких объектов. Если поддержка изменяющихся событий не требуется, зачем тратиться на создание объектов, которые несут "вес" этой функциональной возможности? Благодаря механизму самонастройки можно использовать наиболее подходящую реализацию в приложениях.

Нормализация документа

Один из новых методов, определенных в DOM Level 3 Core, это метод normalizeDocument на интерфейсе Document. Как следует из его названия, этот метод можно использовать для нормализации документа. По умолчанию данный метод выполняет следующее:

  • нормализует узлы Text, объединяя соседние узлы Text в один узел Text;
  • уточняет содержание узлов EntityReference в соответствии с сущностями, на которые они ссылаются;
  • проверяет и корректирует информацию о пространствах имен в документе, делая его корректно оформленным.

Важно отметить, что алгоритм нормализации пространства имен (определенный в Приложении В), используемый в этом методе, работает только с узлами, поддерживающими пространства имен - то есть узлами, созданными с применением методов с суффиксом "NS", как, например, createElementNS. Узлы, не поддерживающие пространства имен - то есть узлы, созданные с помощью методов DOM Level 1, как, например, createElement, - несовместимы полностью с любой обработкой, зависящей от XML Namespaces. Если в документе имеются узлы DOM Level 1, при попытке провести нормализацию пространства имен normalizeDocument не сработает и выдаст сообщение об ошибке. В большинстве случаев не рекомендуется создавать узлы с помощью методов DOM Level 1, если будут использоваться XML Namespaces и выполняться любые операции над документом, которые требуют поддержки XML Namespaces. Сказанное справедливо и в отношении других операций, таких как перепроверка документа в памяти на допустимость по XML Schema.

Для проведения других операций над документом можно также конфигурировать normalizeDocument через DOMConfiguration. Например, этот метод можно использовать, чтобы избавиться от комментариев, чтобы преобразовать узлы CDATASection в узлы Text или чтобы выбросить из дерева все атрибуты объявления пространств имен. Его также можно применять, чтобы просто перевести документ в форму, которая легко преобразуется в XML Infoset, выполнив одновременно все описанное выше. Листинг 3 демонстрирует, как использовать Document.config для управления normalizeDocument.

Листинг 3. Использование Document.config для управления normalizeDocument

// retrieve document configuration
DOMConfiguration config = document.getConfig();
// remove comments from
config.setParameter("comments", false);
// remove namespace declarations
config.setParameter("namespace-declarations", false);
// transform document
core.normalizeDocument();

// put document into a form closest to the XML Infoset 
config.setParameter("infoset", true);
// transform document
core.normalizeDocument();

Метод normalizeDocument также позволяет перепроверить в памяти документ на допустимость по его XML Schema или DTD. Ранее, для того, чтобы перепроверить документ на допустимость после того, как он был модифицирован, требовалось сохранить его в файле и прочитать записанный текст валидирующим парсером. Теперь эту процедуру можно выполнять более эффективно - реализация DOM может перепроверить в памяти документ на допустимость. Для этого, сначала необходимо задать параметр validate интерфейса DOMConfiguration равным true. Затем нужно реализовать объект DOMErrorHandler, в который будут передаваться ошибки проверки на допустимость, и зарегистрировать его с интерфейсом Document, используя параметр error-handler. Это очень похоже на то, что делается с помощью парсера SAX. В конце, вызвав normalizeDocument, можно проверить документ на допустимость. Ниже, в этой статье, мы покажем, как это можно сделать, используя Xerces.

В настоящий момент не существует ни одного стандартного API для доступа к XML Schema Post-Schema Validation Infoset (PSVI, информационный набор XML Schema после проверки на допустимость по схеме). Однако, DOM Level 3 позволяет извлекать некоторую информацию о PSVI. Например, если нужно получить свойство нормализованное по PSVI значение схемы (PSVI-normalized schema value property), можно уточнить дерево нормализованными значениями XML Schema, задав параметры datatype-normalization и validate равными true в DOMConfiguration и вызвав normalizeDocument - что означает, что значения атрибутов и содержание элементов будут представлять это свойство.

Получение информации о типах

Предыдущие версии DOM не предоставляли возможности доступа к информации о типах: отсутствовал какой-либо способ получения типа узла атрибута или элемента документа. Как было упомянуто выше, теперь, благодаря введению нового интерфейса TypeInfo, это стало возможным. Данный интерфейс представляет определение типа в виде пары, состоящей из имени и URI пространства имен. В зависимости от схемы, используемой для проверки документа на допустимость, это соответствие определения типа может изменяться.

Так, если вы используете DTD (во время загрузки или с normalizeDocument), TypeInfo на узле атрибута представляет тип этого атрибута. Это - свойство тип атрибута для информационной единицы атрибут в XML Infoset. Однако, на узле элемента у TypeInfo есть null для имени и null для URI пространства имен, поскольку DTD не определяет типы элементов.

Если теперь воспользоваться XML Schema для проверки документа на допустимость, TypeInfo представляет тип элемента в узле элемента и тип атрибута в узле атрибута. На самом деле TypeInfo также представляет свойство определение типа PSVI для соответствующего элемента и информационных единиц атрибута.

Заметьте, что для того, чтобы эта информация была доступна, элемент или атрибут должен быть допустимым в соответствии с используемой схемой. Если в процессе проверки на допустимость обнаружились ошибки, предполагается, что реализации DOM предоставят объявленный тип для надлежащего исправления документа. Кроме того, если этот тип анонимный (anonymous), будет возвращено уникальное имя, определяемое реализацией.

Использование интерфейса прикладного программирования DOM Level 3 в Xerces

Парсер 2.4.0 Apache Xerces2 является предварительной реализацией DOM Level 3 Core. Однако, поскольку спецификация DOM Level 3 Core пока еще не Рекомендация W3C, эта реализация не включена в стандартный дистрибутив Xerces. Чтобы воспользоваться этой функциональностью, необходимо перейти к классам Xerces для реализации DOM (как, например, org.apache.xerces.dom.DocumentImpl), либо локально построить Xerces, используя адресат "jars-dom3". В результате, генерируется файл dom3-xml-apis.jar, который содержит интерфейс прикладного программирования (API) DOM Level 3, и файл dom3-xercesImpl.jar, который содержит реализацию этого API. Чтобы построить Xerces, необходимо либо извлечь исходный код из системы версионирования файлов (Concurrent Versions System, CVS) либо скачать и исходный код Xerces, и дистрибутив инструментов.

После того, как Xerces с поддержкой DOM Level 3 построен, нужно включить заново сгенерированные файлы jar (dom3-xml-apis.jar и dom3-xercesImpl.jar) в CLASSPATH, а затем можно начать программировать, используя DOM Level 3.

Если все, что требуется, это реализация DOM Level 3 Core, нужно запросить реализацию Xerces, которая поддерживает "Core" и "XML" с использованием механизма самонастройки. Как было упомянуто выше, в результате возвращается реализация DOM, которая использует меньше памяти, но не обеспечивает поддержку факультативных модулей, как например, модуля прохождения.

Напомним, что в DOM Level 3 появился механизм, который позволяет перепроверять в памяти документы на допустимость. Однако, текущая версия Xerces (2.4.0) поддерживает проверку только по XML Schema, но не по DTD. Заметьте, что если реализация DOM поддерживает проверку и по XML Schema, и по DTD, то неясно, что из них должно использоваться для этой проверки. Например, чтобы указать, что нужно перепроверять по XML Schema, можно либо удалить узел DocumentType из документа, отыскав его потомков узла Document и убрав узел, являющийся потомком DocumentType, либо задать параметр schema-type интерфейса DOMConfiguration.

Чтобы связать XML Schema с документом, можно воспользоваться двумя способами:

  • Добавить в documentElement (корневой элемент) атрибут xsi:schemaLocation или xsi:noSchemaLocation и указать расположение схемы в качестве его значения.
  • Присвоить параметру DOMConfigurationschema-location расположение схемы, которая будет использоваться при перепроверке на допустимость.

Заметьте, что при указании расположения схемы необходимо задавать абсолютный URI. Если используется относительный URI, он будет разрешаться относительно расположения документа, указанного в атрибуте documentURI интерфейса Document. В качестве альтернативы можно порекомендовать реализовать, зарегистрировать DOMEntityResolver (определенный в спецификации DOM Level 3 Load and Save) и самостоятельно разрешить эти URI. Листинг 4 демонстрирует, как проводить перепроверку документа на допустимость в памяти.

Листинг 4. Перепроверка на допустимость в памяти

// Retrieve configuration
DOMConfiguration config = document.getConfig();
// Set document base URI
document.setDocumentURI("file:///c:/data");
// Configure the normalizeDocument operation
config.setParameter("schema-type", "http://www.w3.org/2001/XMLSchema");
config.setParameter("validate", true);
config.setParameter("schema-location", "personal.xsd");
// Revalidate your document in memory
document.normalizeDocument();

Заключение

В этой статье было показано, как с помощью новой функциональности, появившейся в DOM Level 3 Core, можно сократить написание кода и улучшить производительность приложения. Ведь чем меньше код, тем незначительнее сопровождение, тем меньше ошибок ("багов") и тем спокойнее жизнь! В этой статье также было рассказано и объяснено, как использовать некоторые мощные новые возможности, как, например, выполнение перепроверки на допустимость в памяти и получение информации о типах - то, о чем давно мечтали разработчики.

Одним словом, DOM Level 3 Core должен облегчить жизнь - особенно в комбинации с другими модулями, такими как DOM Load & Save - и мы надеемся, что эта статья окажется полезной при его использовании.

Ресурсы

  • В первой статье этого цикла рассматриваются операции над узлами: переименование, перемещение узлов из одного документа в другой, задание текстового содержания и т.д. (developerWorks, август 2003г.)
  • Рекомендация W3C DOM Level 2 Core.
  • Спецификация XML Information Set.
  • Последняя редакция рабочей версии DOM Level 3 Core.
  • На странице Технических отчетов и публикаций W3C (W3C's Technical Reports and Publications page) содержится информация о других спецификациях W3C, таких как XML Schemas и Namespaces in XML.
  • Подробная информация о реализации Xerces2 DOM.
  • Последняя версия парсера Xerces-J.
  • Другие ресурсы XML в зоне developerWorks, в том числе вводное учебное пособие "Объяснение DOM" (Understanding DOM, developerWorks, июль 2003г.)
  • Более полная информация о самонастройке DOM представлена в серии статей-рекомендаций Бретта Маклолина (Brett McLaughlin):
    • В Части 1 объясняется, что такое самонастройка, рассматриваются связанные с ней проблемы и раскрываются основы ее использования в DOM Levels 1 и 2 (developerWorks, ноябрь 2002г.)
    • В Часть 2 показано, как улучшить использование самонастройки в приложениях DOM (developerWorks, декабрь 2002г.)
    • В Части 3 рассказывается об изменениях в DOM Levels 3, которые касаются самонастройки, и о том, что улучшено в DOM Levels 1 и 2 (developerWorks, декабрь 2002г.)
  • Популярный форум по технологии XML и Java, поддерживаемый Бреттом Маклолином, это открытое и откровенное сообщество, где обсуждаются любые вопросы о XML и Java.
  • IBM WebSphere Studio Site Developer - надежная, легкая в использовании среда разработки, предназначенная для создания, построения и сопровождения динамических Web-сайтов, приложений и Web-сервисов.
  • Информация о том, как стать Сертифицированным разработчиком IBM в области XML и других смежных технологий (IBM Certified Developer in XML and related technologies).

Об авторе

Арнод Ле Хорс (Arnaud Le Hors) - главный инженер отдела программного обеспечения корпорации IBM, член Группы по методологии разработки XML-стандартов. Он представляет IBM в различных Рабочих группах W3C: XML Core и DOM. Арнод Ле Хорс является редактором спецификаций DOM Level 1, 2 и 3, Core. Он также один из разработчиков Xerces и проектировщиков Xerces2. С ним можно связаться по адресу: lehors@us.ibm.com.

Елена Литани (Elena Litani) - штатный разработчик отдела программного обеспечения в канадском отделении корпорации IBM (IBM Toronto Lab). Она один из ведущих разработчиков Xerces2. Два последних года Елена Литани представитель IBM в Рабочей группе W3C DOM. С ней можно связаться по адресу: elitani@ca.ibm.com.

Автор: Арнод Ле Хорс (Arnaud Le Hors), Елена Литани (Elena Litani)