Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)


 

 

 

 



ТЕМА 7. СЦЕНАРИИ ОБЪЕКТНОЙ МОДЕЛИ ДОКУМЕНТА



 

В предыдущей была рассмотрена программная модель Data Source Object (DSO), которая позволяет использовать либо связывание данных, либо сценарии для отображения XML-документа с HTML-страницы. DSO хранит данные XML как набор записей, что удобно для отображения только тех XML-документов, которые имеют симметричную структуру записей.

В этой главе будет рассмотрена совершенно иная программная модель, известная как Объектная модель XML-документа, или DOM (Document Object Model). DOM состоит из группы программных объектов, представляющих различные компоненты XML-документа. Свойства и методы этих объектов позволяют использовать сценарии для отображения XML-документа с HTML-страницы. DOM хранит данные в иерархической, древообразной структуре, отражающей иерархическую структуру XML-документа — независимо от того, структурирован ли он как набор записей — и её можно использовать для доступа к любым компонентам XML-документа, включая элементы, атрибуты, инструкции по обработке, комментарии и объявления нотаций и примитивов.

Консорциум W3C использует термин Объектная модель документа (Document Object Model, или DOM) для обозначения более широкой объектной модели, которая обеспечивает доступ как к HTML-элементам, так и к XML-документам. Однако здесь этот термин применяется к обычной модели DOM XML, поддерживаемой Internet Explorer и рассчитанной на доступ конкретно к XML-документам.

 

Связывание XML-документа с HTML-страницей

 

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

 

<BODY>

<XML ID="dsoBook" SRC="Book.xml"></XML>

<!-- другие элементы отображаемой части страницы... -->

</BODY>

 

Идентификатор ID, который назначается фрагменту данных, указывает на DSO документа (см. главу 6). Можно использовать составляющую XMLDocument DSO для доступа к DOM, как показано в следующей строке кода сценария:

 

Document = dsoBook.XMLDocument;

 

Член XMLDocument содержит корневой объект DOM, известный как узел Документ (Document node). Узел Документ можно использовать для доступа к другим объектам DOM.

Так, создание фрагмента данных на HTML-странице предписывает Internet Explorer создать как DSO (представленный непосредственно через ID фрагмента данных), так и DOM (доступ к которой осуществляется через член XMLDocument DSO).

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

 

Структура DOM

 

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

DOM использует различные типы узлов для представления различных типов компонентов XML. Например, элемент хранится в узле Element, a атрибут - в узле Attribute. В таблице 5.20 представлены наиболее важные типы узлов.

Таблица 5.20

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

Тип узла Компоненты XML-документа, представляемые узлом Имя узла (свойство nodeName объекта) Значение узла (свойство nodeValue объекта)
Document Корневой узел иерархии документа (т. е. он представляет весь XML-документ) #document null
Element Элемент Имя типа элемента (например, BOOK) null (любые символьные данные, содержащиеся в элементе, находятся в одном или нескольких дочерних узлах Text)
Text Текст, принадлежащий элементу, атрибуту или примитиву, которые представлены родителем этого узла #text Текст родительского XML-компонента
Attribute Атрибут (а также другие пары имя-значение, такие как имя и значение в инструкции по обработке) Имя атрибута (например, “Binding”) Значение атрибута (например, “Жёсткая обложка”)
Processing-Instruction Инструкция по обработке (объявление XML или пользовательская инструкция по обработке) Предназначение инструкции по обработке (например, xml) Полное содержимое инструкции по обработке, за исключением предназначения (например, version="1.0")
Comment Комментарий #comment Весь текст внутри ограничителей комментария
CDATASection Раздел CDATA #cdata-section Содержимое раздела CDATA
DocumentType Объявление типа документа Имя корневого элемента, содержащееся в объявлении DOCTYPE (например, INVENTORY) null
Entity Объявление примитива в DTD Имя примитива (например, “image”) null (значение примитива содержится в дочернем узле Text)
Notation Объявление нотации в DTD Имя нотации (например, “BMP”) null (системный литерал нотации содержится в дочернем узле Attribute с именем SYSTEM)

 

Можно получить каждое из имен узлов (они приведены в третьем столбце) из свойства узла nodeName. Имена, начинающиеся с символа #, представляют компоненты XML, не поименованные в документе. (Например, комментарий в XML-документе не обладает именем. В связи с этим DOM использует стандартное имя #comment.) Другие имена узлов получаются из имен, присвоенных соответствующим компонентам в XML-документе. (Например, узел Element, представляющий элемент типа BOOK, также должен носить имя BOOK.)

Можно получить каждое из значений узла (перечисленные в последнем столбце) из свойства узла nodeValue. Если компонент XML имеет соответствующее значение (например, атрибут), это значение будет храниться в значении узла. Если компонент XML не имеет значения (например, элемент), DOM устанавливает в качестве значения узла null. Подробнее о большинстве типов узлов, перечисленных в таблице 9.1, будет рассказано далее в этой главе.

DOM организует узлы XML-документа в виде древообразной иерархической структуры, которая отражает иерархическую структуру самого документа. При этом создается единственный узел Document, который представляет весь XML-документ и служит корневым элементом в этой иерархии. Заметим, что логическая иерархическая структура элементов XML, в которой элемент Документ является корневым - это лишь одна из ветвей иерархической структуры узлов DOM, которые представляют весь документ.

Возьмем, например, XML-документ из Листинга 1.27. Этот документ состоит из объявления XML, комментария и корневого элемента, который включает дочерние элементы, а также атрибуты. На рисунке 46 показана иерархическая организация узлов, которые создает DOM для представления документа. Для каждого компонента рассматриваемого документа на рисунке указан тип узла, используемого для представления компонента (например, Document, Comment и Element), а также имя узла (оно указано в скобках - например, #document, #comment и INVENTORY).

 

<?xml version=”1.0”?>

<!-- Имя файла: Inventory06.xml -->

<INVENTORY>

<BOOK Binding=”Жёсткая обложка”>

<TITLE>Война и мир</TITLE>

<AUTHOR Country=”Россия”>Лев Толстой</AUTHOR>

<PAGES>510</PAGES>

<PRICE>12 000 рублей</PRICE>

</BOOK>

<BOOK Binding=”Мягкая обложка”>

<TITLE>Преступление и наказание</TITLE>

<AUTHOR Country=”Россия”>Фёдор Достоевский</AUTHOR>

<PAGES>590</PAGES>

<PRICE>14 000 рублей</PRICE>

</BOOK>

<BOOK Binding=”Мягкая обложка”>

<TITLE>Королева Марго</TITLE>

<AUTHOR Country=”Франция”>Александр Дюма</AUTHOR>

<PAGES>410</PAGES>

<PRICE>10 000 рублей</PRICE>

</BOOK>

</INVENTORY>

Листинг 1.27

 

Рисунок 46. Иерархическая организация узлов на примере XML-документа из листинга 1.27

 

Каждый узел, как программный объект, имеет свойства и методы, которые позволяют осуществлять доступ, отображать, обрабатывать и получать информацию о соответствующем компоненте XML. Например, свойства nodeName и nodeValue (см. таблицу 5.20) дают имя компонента и его значение.

Все типы узлов используют общий набор свойств и методов. Эти свойства и методы разработаны для работы с узлами вообще. В таблице 5.21 представлены некоторые наиболее полезные свойства. Более подробная информация и примеры использования этих свойств будут представлены далее в этой главе.

Таблица 5.21

Некоторые полезные свойства, поддерживаемые всеми типами узлов

Свойство Описание Пример
attributes Множество NamedNode Map всех дочерних узлов-атрибутов данного узла AttributeNode = Element.attributes.getNamedItem("Binding");
childNodes Множество NodeList всех дочерних узлов, не являющихся атрибутами, данного узла FirstNode = Element.childNodes(0);
dataType Тип данных этого узла (применительно только к определенным типам узлов Attribute) AttributeType = Attribute.dataType;
firstChild Первый дочерний узел данного узла, не являющийся атрибутом FirstChildNode = Element.firstChild;
lastChild Последний дочерний узел данного узла, не являющийся атрибутом LastChildNode = Element.lastChild;
nextSibling Следующий узел на том же уровне данного узла NextElement = Element.nextSibling;
nodeName Имя данного узла ElementName = Element.nodeName;
nodeType Цифровой код, указывающий на тип данного узла NodeTupeCode = Node.nodeType;
nodeType-String Строка, содержащая тип данного узла, строчными буквами (например, “element” или “attribute”) NodeTypeString = Node.nodeTypeString;
nodeValue Значение данного узла (или null, если он не содержит значения) AttributeValue = Attribute.nodeValue;
ownerDocu-ment Корневой узел Document документа, содержащего данный узел Document = Node.ownerDocument;
parentNode Узел, для которого данный узел является дочерним (не действует для узла Attribute) ParentElement = Element.parentNode;
previousSibling Предыдущий узел на том же уровне данного узла PreviousElement = Element.previousSibling;
text Все текстовое содержимое данного узла и все подчиненные узлы Element AIICharacterData = Element.text;
xml Все содержимое XML данного узла и все его подчиненные узлы XMLContent = Element.xml;

 

Свойство будет иметь значение null, если данное свойство не применимо к определенному узлу. Например, если узел представляет XML-компонент, который не имеет атрибутов (например, узел Document или Comment), его свойство attributes будет иметь значение null. Если узел представляет XML-компонент, который не имеет типа данных (тип данных имеют только определенные атрибуты), его свойство dataType будет иметь значение null. Если узел не имеет дочернего узла, не являющегося атрибутом, его свойство firstChild будет иметь значение null. Если узел относится к типу, который не имеет значений (например, узел Document или Element), его свойство nodeValue также будет иметь значение null.

Помимо общих свойств и методов, каждому типу узла присущи дополнительные свойства и методы, разработанные для работы с определенным XML-компонентом, который представляет узел. Например, узел Document имеет свойство parseError, которое содержит информацию о любой ошибке, возникающей в процессе обработки документа. Данное свойство присуще только узлу Document. В таблице 5.22 будут представлены наиболее полезные свойства и методы для некоторых типов узлов.

Каждый узел в таблице 5.21 обладает набором свойств, которые позволяют перемещаться в иерархии узла — т. е. получать доступ к другим узлам от текущего узла. Например, рассмотрим документ из Листинга 1.27. Если переменная Document содержит корневой узел Document, следующий код приведет к отображению содержимого комментария, расположенного в начале документа (этот комментарий DOM хранит как второй дочерний узел узла Document):

 

alert(Document.childNodes(1).nodeValue);

 

Эта строка вызовет отображение сообщения, содержащего текст “Имя файла: Inventory07.xml”.

В предыдущем разделе было описано, как осуществлять доступ к корневому узлу Document через член XMLDocument DSO, который получается из фрагмента данных XML. Узел Document является шлюзом к XML-документу. Его можно использовать для доступа к другим узлам.

 



Просмотров 754

Эта страница нарушает авторские права




allrefrs.su - 2025 год. Все права принадлежат их авторам!