Язык XML - практическое введение (часть 2)

       

использующие Dynamic HTML для создания


Разработчики, использующие Dynamic HTML для создания динамических HTML страниц, видимо, оценят новые возможности по управлению информацией, появившейся с включением в Internet Explorer 5 поддержки DOM Level1 и стилевых таблиц XSL.

   HTML-документы давно уже стали привычным форматом для представления информации в Web. Но, к сожалению, их содержимое практически не описывается тэгами и единственное, что может делать с данными броузер, это форматировать их и выводить на экран. Передаваемая клиенту информация в виде HTML страницы доступна для пользователя лишь в том виде, в котором она была сформирована на стороне сервера и практически невозможно динамическое изменение данных в зависимости от текущих потребностей пользователя. Впервые попытка хранения информации независимо от форматирующих ее тэгов была сделана в спецификации Dynamic HTML для IE 4 - в объектную модель броузера были добавлены т.н. объекты источников данных (Data Source Object - DSO). Эти объекты позволяли динамически "назначать" информацию для тех или иных фрагментов HTML документа(например, таблицам), которую затем отображал броузер, и являлись, по сути, "островками данных" для моря остальных форматирующих тэгов документа. Следующим шагом в этом направлении стало появление нового тэга <xml> и включение в объектную модель Internet Explorer новых объектов доступа к XML-данным.

   Говоря об объектной модели броузера необходимо уточнить, что в данном случае имеется в виду интерфейс доступа к содержимому документа для сценариев, а вовсе не часть программного обеспечения броузера. Некоторые интерфейсы доступны для других приложений и являются, по сути, COM-интерфейсами, некоторые могут использоваться только внутри. Для нас не важно, как представлены объекты в программной модели броузера - мы будем рассматривать объектную модель как набор объектов, их методов и событий, доступных для сценария внутри страницы.

   Из внутренних сценариев HTML страницы обращение к методам объекта данных выглядит также, как и для любого другого элемента документа - при помощи его идентификатора или по индексу в коллекции классов страницы. Вот например, как можно это сделать через JScript (версия JavaScript от Microsoft):

<xml ID="xmlNotes" src="notes.xml"></xml> <script language=JAVASCRIPT> var node_value = xmlNotes.document.all("xmlNotes").XMLDocument.nodeValue; var document_text = xmlNotes.documentElement.text; </script>



    При этом ссылка на элемент данных HTML страницы в сценарии автоматически предоставляет нам доступ к объектной модели XML документа, создаваемой обработчиком в памяти компьютера сразу после загрузки документа.

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

   Во-вторых, XML документы можно форматировать при помощи стилевых таблиц XSL. Стилевые таблицы позволяют управлять процессом отображения элемента на экране броузера, меняя в зависимости от его типа и месторасположения в документе используемые для этого форматирующие тэги. Кроме того, стилевые таблицы могут использоваться также и для поиска нужных фрагментов внутри документа, выводя по желанию пользователя отдельные его части независимо от остального содержимого. XSL инструкции в Internet Explorer 5.0 позволяют "фильтровать" и обрабатывать сложные XML документы, со множеством рекурсивно вложенных, сложноподчиненных элементов с нефиксированным набором атрибутов и строгими требованиями к порядку их определения внутри документа.

   В-третьих, доступ к XML-данным возможен из сценариев внутри страницы, имеющих доступ практически к любому элементу документа через соответствующие объекты. Использование Dynamic HTML представляет собой наиболее гибкий и мощный способ формирования динамически изменяемой информации на стороне клиента. Структурированные данные XML-документа могут загружаться в страницу при помощи тэгов <xml>, <object> или <script>, в которых указывается либо адрес документа, либо непосредственно сами XML-элементы:

<xml ID="xmlNotes1" src="notes.xml"></xml> ... <xml ID="xmlNotes2"> <notepad> <note id="5"> <text>Очень важная информация</text> </note> </notepad> </xml> ... <script language="xml" ID="xmlNotes3"> <notepad id="6"> <note> <text>Очень важная информация</text> </note> </notepad> </script> ... <script language=JAVASCRIPT> var root_node = document.all.("SCRIPT").XMLDocument; </script>



    Возможны комбинации всех этих подходов - загрузка и обработка XML документа в сценариях через методы объектов DOM; включение стилевых таблиц в страницу при помощи тэга <xml>, их модификация в соответствии с запросами пользователя, назначение XSL-стилей для XML-документов прямо из сценариев, включение фрагментов скриптов непосредственно в XML документы при помощи блока CDATA.

   Internet Explorer DOM

   В настоящий момент Microsoft Internet Explorer является первым броузером, поддерживающим спецификацию DOM Level 1. Для сценариев на стороне клиента доступно множество объектов для работы с XML-документом. Полное их описание является темой отдельной статьи, здесь же рассмотрим лишь самые важные из них, объекты XMLDOMDocument, XMLDOMNode, XMLDOMNodeList, представляющие интерфейс для доступа ко всему документу, отдельным его узлам и поддеревьям соответственно. Также рассмотрим объект XMLDOMParseError, предоставляющий необходимую для отладки информацию о произошедших ошибках анализатора (т.к. его методы, к сожалению, на первых шагах используются очень часто). Описание дается по материалам официального руководства, расположенного на сервере Microsoft: msdn.microsoft.com/xml/, и является упрощенным и сокращенным его вариантом, поэтому если приведенных в таблице сведений будет недостаточно, нужно обратиться к первоисточнику.

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

nodeName

Возвращает полное название(вместе с Namaspace атрибутом) текущего узла в виде строки. Доступно только для чтения.



baseName

Возвращает название элемента без префикса Namespace. Только для чтения.

prefix

Возвращает Namespace префикс. Только для чтения.

namespaceURI

Возвращает URI Namespace префикса текущего элемента

dataType

Определяет тип содержимого текущего узла(описываемое схемами данных). Доступно для записи и чтения

nodeType

Возвращает тип текущего узла:

NODE_ELEMENT (1) - элемент

NODE_ATTRIBUTE (2) - атрибут

NODE_TEXT (3) - текст

NODE_CDATA_SECTION (4) - область CDATA

NODE_ENTITY_REFERENCE (5) - объект ссылки на "макроподстановки"

NODE_ENTITY (6) - объект ссылки на т.н. "подстановочые символы" - entity"

NODE_PROCESSING_INSTRUCTION (7) - область инструкций XML процессору

NODE_COMMENT (8) - комментарий

NODE_DOCUMENT (9) - корневой элемент документа

NODE_DOCUMENT_TYPE (10) - описание типа документа, задаваемое тэгом <!DOCTYPE>

NODE_DOCUMENT_FRAGMENT (11) - фрагмент XML-документа - несвязанное поддерево

NODE_NOTATION (12) - DTD нотация.

Свойство доступно только для чтения.

nodeTypeString

Возвращает тип узла в виде текста. Только для чтения.

attributes

Возвращает список атрибутов текущего узла в виде коллекции XMLDOMNamedNodeMap. Если атрибутов нет, то свойство length будет содержать нулевое значение. Для тех узлов, у которых не может быть атрибутов (в XML документе они могут быть назначены лишь объектам элементов, макроподстановок и нотаций) возвращается null. Для объектов макроподстановок и нотаций содержимым коллекции будут являться атрибуты SYSTEMID, PUBLICID и NDATA. Доступно только для чтения.

definition

Возвращает DTD определение для текущего узла дерева.

Содержимое текущего узла

text

Возвращает содержимое текущего поддерева(узла и всех его дочерних элементов). Доступно для записи и чтения

xml

Возвращает XML-представление текущего поддерева. Доступно только для чтения

nodeValue

Возвращает содержимое текущего узла. Доступно для чтения и записи.

Работа со списком дочерних элементов



childNodes

Для тех узлов, которые имеют дочерние элементы возвращает их список в виде XMLDOMNodeList. В том случае, если дочерних элементов нет, значение свойства length списка равно нулю . Только для чтения.

lastChild

Возвращает последний дочерний элемент или null, если таковых не имеется. Свойство доступно только для чтения.

firstChild

Возвращает последний дочерний элемент или null. Только для чтения.

nextSibling

Возвращает следующий дочерний элемент. Только для чтения.

previousSibling

Возвращает предыдущий дочерний элемент. Доступно только для чтения.

parentNode

Содержит ссылку на родительский элемент. В том случае, когда такого элемента нет, возвращает null. Доступно только для чтения.

ownerDocument

Возвращает указатель на документ, в котором находится текущий узел. Если в процессе модификации дерева узел будет перенесен в другой документ, то значение этого свойства автоматически изменится. Только для чтения.

Методы Добавление новых элементов в объектную модель документа

appendChild(newChild)

Добавляет текущему узлу новый дочерний элемент. Возвращает ссылку на объект этого нового элемента. То же самое можно сделать и при помощи insertBefore (newChild, null)

insertBefore(newChild, refChild)

Вставляет дочерний узел, располагая его в текущем поддереве "левее" узла, указанного параметром refChild. Если последний параметр не задан, то новый узел будет добавлен в конец списка.

Модификация и удаление узлов

cloneNode (deep)

Создание копии текущего элемента. Параметр deep определяет, будет ли эта процедура рекурсивно выполняться для всех дочерних элементов. Возвращаемое значение - ссылка на новый элемент

replaceChild(newChild, oldChild)

Замена объекта oldChild текущего списка дочерних объектов на newChild. Если newChild=null, то старый объект будет просто удален.

removeChild(oldChild)

Удаление объекта oldChild из списка дочерних элементов

Поиск узлов (выделение поддеревьев)

selectNodes(patternString)

Возвращает объект XMLDOMNodeList, содержащий поддерево, выбранное по шаблону поиска pattertnString



selectSingleNode(patternString)

Аналогичен методу selectNodes, только возвращает первый узел из найденного поддерева

Обработка поддеревьев стилевыми таблицами

transformNode(stylesheet)

Назначает стилевую таблицу для поддерева текущего узла и возвращает строку - результат обработки. В качестве параметра передается ссылка на объект DOMDocument, в котором находятся XSL инструкции.

transformNodeToObject(stylesheet, outputObject)

То же, что и transformNode, только результат - обработанное дерево передается в объект XMLDocument(другое дерево), задаваемый параметром outputObject

   
Объект XMLDOMDocument
Представляет верхний уровень объектной иерархии и содержит методы для работы с документом: его загрузки, анализа, создания в нем элементов, атрибутов, комментариев и т.д. . Многие свойства и методы этого объекта реализованы также в рассмотренном выше класса Node, т.к. документ может быть рассмотрен как корневой узел с вложенными в него поддеревьями.
Свойства
Получение и информации о текущем состоянии процесса загрузки и анализа документа.

async

Свойство, доступное для записи и чтения, идентифицирующее текущий режим обработки (синхронный или асинхронный)

parseError

Возвращает ссылку на объект XMLDOMParseError, при помощи которого можно получить всю необходимую информацию о последней ошибке анализатора. Только для чтения.

readyState

Содержит информацию о текущем состоянии анализатора:

  • LOADING (1) - находится в процессе загрузки документа


  • LOADED (2) - загрузка завершена, но объектная модель документа еще не создана


  • INTERACTIVE (3) - объектная модель создана(все элементы документа разобраны, установлены их связи и атрибуты) но доступна пока только для чтения


  • COMPLETED (4) - с ошибками или без, но документ разобран


  • Для получения своевременной информации о текущем состоянии анализатора можно воспользоваться обработчиком событий onreadystatechange

    Только для чтения.

    ondataavailable

    Свойство, доступное только для записи, которое содержит ссылку на обработчик события ondataavailable (вызывается, когда обработчик обрабатывает очередную порцию данных документа)



    onreadystatechange

    Ссылка на обработчик события onreadystatechange (вызывается каждый раз, когда меняется состояние обработчика - свойство readyState)

    ontransformnode

    Ссылка на обработчик события ontransformnode (вызывается перед каждой трансформацией узла стилевыми таблицами)

    Изменение параметров обработчика.

    preserveWhiteSpace

    Определяет, должны ли при разборе документа игнорироваться символы разделителей. Если значение свойства ложно, то будут, если истина - то разделители будут сохранены. По умолчанию установлено в false. Доступно для чтения и записи.

    resolveExternals

    Свойство определяет, будут ли в процессе анализа разбираться внешние определения (DTD-описания, макроподстановки и т.д.) - значение true или нет(false). Доступно для чтения и записи.

    validateOnParse

    Включение - выключение верификации документа. Значения true или false. Доступно для чтения и записи.

    Получение информации о загруженном документе

    doctype

    Возвращает тип документа, определяемый при его создании тэгом <!DOCTYPE>, включающим DTD. Если в документе нет DTD описаний, возвращается null. Только для чтения.

    url

    Возвращает URL документа(в случае успешной его загрузки, в противном случае возвращает null). Доступно только для чтения.

    implementation

    Возвращет объект XMLDOMImplementation для данного документа. Только для чтения.

    documentElement

    Содержит ссылку на корневой элемент документа в виде объекта XMLDOMElement. Если корневого элемента нет, то возвращается null. Доступно для записи

    Методы Загрузка и сохранение документов

    load(url)

    Загружает документ, адрес которого задан параметром url. В случае успеха возвращает логическое значение true. Необходимо иметь в виду, что вызов этого метода сразу же обнуляет содержимое текущего документа

    loadXML(xmlString)

    Загружает XML - фрагмент, определенный в передаваемой строке

    save(objTarget)

    Сохраняет документ в файле (objTarget - строка, содержащая URL файла) или внутри другого документа (objTarget - объект XMLDOMDoument).



    abort()

    Прерывание процесса загрузки и обработки документа. Обработчик ошибок XMLDOMParseError будет содержать в коде ошибки соответствующее значение.

    Создание новых объектов. Необходимо отметить, что все методы лишь создают указанные объекты и для включения их в объектную модель документа надо дополнительно использовать методы insertBefore, insertAfter или appendChild.

    createAttribute (name)

    Создает для текущего элемента новый атрибут с указанным именем. Новый атрибут добавляется в объектную модель документа только после определения его значения методом setAttribute.

    createNode(Type, name, nameSpaceURI)

    Создает узел указанного типа и названия. Namespace префикс задается параметром nameSpaceURI. Возвращаемым значением будет созданный объект указанного типа.

    createCDATASection(data)

    Создает область CDATA - возвращает объект XMLDOMCDATASection

    createDocumentFragment()

    Создает новый пустой фрагмента документа - объект XMLDOMDocumentFragment

    createComment(data)

    Создает комментарий.

    createElement(tagName)

    Создает элемент документа с указанным названием.

    createEntityReference(name)

    Создает ссылку на подстановочные символы

    createProcessingInstruction(target, data)

    Создает новую директиву XML-процессора

    createTextNode(data)

    Создает текст внутри документа

    Поиск узлов дерева документа

    getElementsByTagName(tagname)

    Возвращает ссылку на коллекцию элементов документа с заданным именем (или всех элементов, если значение tagname равно "*")

    nodeFromID(idString)

    Поиск элемента по идентификатору

    hasChildNodes()

    Возвращает истину, если текущий узел содержит поддерево.

       
    Объект XMLDOMNodeList
    Представляет собой список узлов - поддеревья и содержит методы, при помощи которых можно организовать процедуру обхода дерева.
    Свойства
    length

    число элементов списка узлов

    Методы item(i)

    Выбор i-того элемента из списка. Возвращает объект XMLDOMNode

    nextNode()

    Выбор следующего элемента в списке. Если такого элемента нет, то возвращает null. первый вызов этого метода(после сброса итератора) возвратит ссылку на первый элемент списка.



    reset()

    Сброс внутреннего указателя текущего элемента

       
    Объект XMLDOMParserError
    Объект позволяет получить всю необходимую информацию об ошибке, произошедшей в ходе разбора документа. Все свойства этого объекта доступны только для чтения.
    Свойства
    errorCode

    Содержит код возникшей ошибки либо 0, если таковой не случилось.

    url

    Возвращает URL обрабатываемого документа

    filepos

    Возвращает смещение относительно начала файла фрагмента, в котором обнаружена ошибка

    line

    Содержит номер строки, содержащей ошибку

    linepos

    Позицию ошибки в строкев которой была обнаружена ошибка

    reason

    Описание ошибки

    srcText

    Содержит полный текст строки, в которой произошла ошибка

       Приведем некоторые примеры использования объектной модели.

       


    Содержание раздела