ГЛАВА 9 Сценарии объектной модели документа

Сценарии объектной модели документа

В восьмой главе вы познакомились с программной моделью 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-документам. (См. спецификацию «Document Object Model (DOM) Level 1 Specification» по адресу http:// www.w3.org/TR/REC-DOM-Level-l.) Однако здесь этот термин применяется к обычной модели DOM XML, поддерживаемой Internet Explorer 5 и рассчитанной на доступ конкретно к XML-документам.

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

Ссылка. Для получения более подробной информации о DOM обратитесь к двум Web-страницам, предлагаемым Microsoft Developer Network (MSDN): «XML DOM User Guide» по адресу http://msdnmicrosoft.com/ xml/xmlguide/dom-guide-overview.asp и «XML DOM Reference» по адресу http://msdn.microsoft.com/xml/reference/xmldom/start.asp.

 

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

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

<BODY>

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

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

</BODY>

Подробнее о фрагментах данных рассказано в разделе «Шаг первый: установка связи XML-документа с HTML-страницей» в главе 8.

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

Document = dsoBook.XMLDocument;

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

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

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

 

Структура DOM

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

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

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

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

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

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

DOM организует узлы XML-документа в виде древообразной иерархической структуры, которая отражает иерархическую структуру самого

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

Возьмем, например, XML-документ из Листинга 9-1. (Копия этого листинга содержится на прилагаемом к книге CD-ROM в файле Inventory Dom.xml.) Этот документ состоит из объявления XML, комментария и корневого элемента, который включает дочерние элементы, а также атрибуты. На рисунке на следующей странице показана иерархическая организация узлов, которые создает DOM для представления документа. Для каждого компонента рассматриваемого документа на рисунке указан тип узла, используемого для представления компонента (например, Document, Comment и Element), а также имя узла (оно указано в скобках - например, «document, «comment и INVENTORY).

Листинг 9-1

Inventory Dom.xml

<?xml version="1.0"?>

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

<INVENTORY>

<BOOK Binding="mass market paperback">

<TITLE>The Adventures of Huckleberry Finn</TITLE>

<AUTHOR Bom=" 1835">Mark Twain</AUTHOR>

<PAGES>298</PAGES>

<PRICE>$5.49</PRICE> 

</BOOK> 

<BOOK Binding="trade paperback">

<TITLE>The Marble Faun</TTTlE>

<AUTHOR Born="1804">Nathaniel Hawthorne</AUTHOR>

<PAGES>473</PAGES>

<PRICE>$10.95</PRICE> 

</BOOK> 

<BOOK Binding="hardcover">

<TITLE>Моbу-Dick</TITLE>

<AUTHOR Born="1819">Herman Melville</AUTHOR>

<PAGES>724</PAGES>

<PRICE>$9.95</PRICE>

</BOOK>

</lNVENTORY>

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

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

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

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

Подсказка. Если вы хотите познакомиться со всеми свойствами, методами и событиями, принадлежащими различным типам объектов-узлов, обратитесь к следующей Web-странице, предоставленной MSDN: http://msdn.microsoft.com/xml/reference/scriptref/xmldom_Objects.asp. Обратите внимание, что на этой странице каждому имени узла, которые приведены в таблице 9.1, предшествует префикс XMLDOM - например, XMLDOMDocument, XMLDOMElement и XMLDOMText. (Это имена программных интерфейсов для каждого типа узла.) Обратите внимание также, что общие свойства и методы узлов представлены как XMLDOMNode.

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

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

Обратите внимание в таблице 9.2, что каждый узел обладает набором свойств, которые позволяют вам перемещаться в иерархии узла — т. е. получать доступ к другим узлам от текущего узла. Например, рассмотрим документ из Листинга 9-1. Если переменная Document содержит корневой узел Document, следующий код приведет к отображению содер-: жимого комментария, расположенного в начале документа (этот комментарий DCJM хранит как второй дочерний узел узла Document):

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

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

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

Доступ и отображение элементов ХМ L-документа

В этом разделе вы познакомитесь с основными приемами использования HTML-страницы и DOM для отображения элементов XML-документа. Эти приемы демонстрируются в Листингах 9-2 и 9-3. (Копии этих листингов содержатся на прилагаемом к книге CD-ROM в файлах Book.xml и DomDemo Rxed.htm.)

 

Листинг 9-2

Book.xml

<?xmlversion="1.0"?> 

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

<ВООК>

<TITLE>The Adventures of Huckleberry Finn</TITLE>

<AUTHOR>Mark Twain</AUTHOR>

<BINDING>mass market paperback</BINDING>

<PAGES>298</PAGES>

<PRICE>$5.49</PRICE> 

</BOOK>

 

Листинг 9-3

DomDemo Fixed.htm

<!-- Имя файла: DomDemo Fixed.htm -->

<HTML>

<HEAD>

<TITLE>Book Description</TTTLE>

<SCRIPT LANGUAGE="JavaScript" FOR="window" EVENT="ONLOAD"> 

Document = dsoBook.XMLDocument; 

titte.innerText=

Document.documentElement.childNodes(0).text; 

author.innerText=

Document.documentElement.childNodes( 1 ).text; 

binding.innerText=

Document.documentElement.childNodes(2).text; 

pages.innerText=

Document.documentElement.childNodes(3).text; 

price.innerText=

Document.documentElement.childNodes(4).text; 

</SCRIPT>

</HEAD> 

<BODY>

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

<H2>Book Description</H2>

<SPAN STYLE="font-style:italic">Trtle: </SPAN>

<SPAN ID="title" STYLE="font-weight:bold"></SPAN>

<BR>

<SPAN STYLE="font-style:italic">Author: </SPAN>

<SPAN ID="author"></SPAN>

<BR>

<SPAN STYLE="font-style:italic">Binding: </SPAN>

<SPAN ID="binding"></SPAN>

<BR>

<SPAN STYLE="font-style:italic">Number of pages: </SPAN>

<SPAN ID="pages"></SPAN>

<BR>

<SPAN STYLE="font-style:italic">Price: </SPAN>

<SPAN ID="price"></SPAN>

</BODY> 

</HTML>

Листинг 9-2 содержит простой XML-документ, который описывает одну книгу. Его корневой элемент, BOOK, содержит пять дочерних элементов (TITLE, AUTHOR, BINDING, PAGES и PRICE), каждый из которых содержит символьные данные, описывающие характеристики книги.

Листинг 9-3 содержит HTML-страницу, которая отображает содержимое каждого из дочерних элементов в XML-документе. На следующем рисунке показано как эта страница выглядит в Internet Explorer 5.

XML-документ связан со страницей через следующий фрагмент данных: 

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

Страница отображает XML-документ посредством следующего блока кода сценария, который содержится в элементе HEAD страницы:

<SCRIPT lANGUAGE="JavaScript" FOR="window" EVENT="ONLOAD"> 

Document = dsoBook.XMLDocument; 

title.innerText=

Document.documentElement.childNodes(0)text; 

author.innerText=

Document.documentElement.childNodes( 1 )text; 

binding.innerText=

Document.dxumentElement.childNodes(2)text; 

pages.innerText=

Document.documentElement.childNodes(3)text; 

price.innerText=

Document.documentElement.childNodes(4)text; 

</SCRIPT>

Установки атрибутов FOR="window" и EVENT="ONLOAD" предписывают браузеру выполнять код из элемента SCRIPT при первом открытии окна страницы до того, как будет отображено содержимое страницы.

Ссылка. Примеры сценариев в этой главе написаны на языке Microsoft JScript - версии Microsoft родового языка для сценариев JavaScript. Полную информацию о JScript, включая учебник, вы можете найти на следующих Web-сайтах, предоставленных MSDN: http:// msdn.microsoft.com/workshop/c- frame.htm# /workshop/languages/ j script/handling.asp и http: //msdn.microsoft.com/scripting/ default.htm?/scripting/jscript/default.htm.

Сценарий первым делом получает узел Document, который представляет весь документ и формирует корневой элемент иерархии узлов DOM. Он делает это через член XMLDocument DSO, как было описано ранее в этой главе:

Document = dsoBook.XMLDocument;

Далее сценарий получает доступ и отображает символьные данные, содержащиеся в каждом из дочерних элементов корневого элемента (TITLE, AUTHOR, BINDING, PAGES и PRICE). Например, он отображает содержимое первого дочернего элемента (TITLE) следующим образом:

title.innerText=

Document.documentElement.childNodes(0).text;

Вот пояснение выражения, стоящего справа от знака равенства.

  • Document содержит узел Document в основании (корне) иерархии узлов DOM.
  • documentElement представляет собой свойство узла Document. Оно содержит узел Element, представляющий корневой элемент XML-др-кумента - в нашем примере, BOOK.

Примечание. Свойство documentElement является одним из специфических для конкретного узла свойств, предоставляемых узлом типа Document. В таблице 9.3 представлены другие полезные свойства, а также методы, относящиеся к узлу Document. Имейте в виду, что для узла Document вы можете использовать и общие свойства узлов, представленные в таблице 9.2.

  • childNodes является свойством узла Element для корневого элемента. Оно содержит множество всех дочерних узлов корневого узла Element, не являющихся атрибутами. В нашем примере оно содержит узлы Element для пяти дочерних XML-элементов: TITLE, AUTHOR, BINDING, PAGES и PRICE. Выражение childNodes(O) ссылается на первый из этих дочерних узлов (а именно, на элемент TITLE).

Примечание. В рассматриваемом примере страницы (Листинг 9-3) вы можете использовать выражение Document.childNodes(2), чтобы получить доступ к узлу корневого элемента. (Выражение Document.childNodes(0) относится к узлу XML-объявления, а выражение Document.childNodes(l) относится к узлу комментария.) Однако преимущество использования свойства documentElement узла Document заключается в том, что его значение не зависит от положения корневого элемента внутри XML-доку-мента. Например, если бы вы удалили комментарий в начале документа, либо" если бы добавили объявление типа документа, выражение Document.childNodes(2) больше не представляло бы корневой элемент.

  • text является свойством узла, возвращаемого выражением childNodes(O). Оно предоставляет весь текст, содержащийся в этом узле, а также текст, принадлежащий любому подчиненному узлу Element. В нашем примере TITLE не имеет подчиненных элементов, поэтому свойство text содержит только собственно текст элемента TITLE, «The Adventures of Huckleberry Finn».

Примечание. Свойства childNodes и text относятся к общим свойствам узлов (см. таблицу 9.2).

Таблица 9.3. Полезные свойства и методы, предоставляемые узлами Document. Общие свойства приведены в таблице 9.2

Свойство узла Document
Описание
Пример
Doc type
Узел DocumentType, представляющий объявление типа документа
DocumentType = Document.doctype;
documentElement
Узел Element, представляющий корневой элемент
RootElement = Document.documentElement;
ondataavailable
Если вы присвоите этому свойству имя функции, которую вы написали, функция будет вызываться в момент доступности данных XML
Document.ondataavailable = MyDataAvailableMandler; (Функция MyDataAvauableHandler будет вызываться, когда станут доступными данные XML)
onreadystatec hange
Если вы присвоите этому свойству имя функции, которую вы написали, функция будет вызываться всякий раз, когда изменяется свойство readyState узла Document (Об этом свойстве см. далее в этой таблице)
Document.onreadystatechange = MyReadyStateHandler; (Функция MyReadyStateHandler будет вызываться всякий раз при изменении свойства readyState узла Document)
parseError
Объект, который содержит информацию о любых ошибках, которые возникают в процессе обработки документа
ErrorCode = Document.parseError.errorCode;
readyState
Текущий статус загрузки и обработки XML-до-кумента. Может принимать одно из следующих числовых значений: 0: не инициализирован 1: загружается 2: загружен 3: интерактивный режим 4: завершение
if (Document.readyState == 4) /* обработка данных... */
url
URL XML-документа
URL = Document.url;
getElementsByTagName (type-name)
Возвращает множество NodeList всех элементов в документе, которые имеют заданное имя типа. Если указано «*», возвращает все элементы
AuthorElementCollection = DocumentgetElementsByTagName ('AUTHOR');
NodeFromlD (id-value)
Возвращает узел, представляющий элемент, чей атрибут типа ID имеет указанное значение. (Подробнее об атрибутах ID см. раздел «Задание маркерного типа» в главе 5)
Element = Document.nodeFromID ("8021");

Символьные данные элемента TITLE, которые получены из выражения справа от знака равенства («The Adventures of Huckleberry Finn») присваиваются свойству innerText HTML-элемента SPAN, имеющему идентификатор title:

trtle.innerText=

Document.documentElement.childNodes(0).text;

Этот элемента SPAN определен внутри элемента BODY HTML-страницы следующим образом:

<SPAN ID="title" STYLE="font-weight:bold"></SPAN>

Присвоение символьных данных свойству innerText элемента SPAN приводит к тому, что элемент SPAN отображает текст с использованием формата, определенного в его начальном теге (font-weight:bold).

Подсказка. В Dynamic HTML (DHTML), который поддерживает Internet Explorer 5, каждый HTML-элемент имеет набор свойств, которые вы можете использовать для установки или получения различных характеристик элемента через код сценария. Свойство innerText устанавливает или получает текстовое содержимое элемента. Подробную информацию о работе с HTML и DHTML в Internet Explorer 5 вы можете найти на Web-сайте, предоставленном MSDN: http://msdn.microsoft.com/workshop/ author/default.asp.

 

Использование объекта NodeList

Свойство childNodes узла содержит набор дочерних узлов текущего узла, не являющихся атрибутами. (Доступ к дочерним узлам-атрибутам осуществляется через свойство attribute узла.) Определенный тип набора, который содержит свойство childNodes, носит название объекта NodeList.

Чтобы извлечь определенный дочерний узел из объекта NodeList, вы можете обратиться к его методу item, указав при этом индекс дочернего узла, который вы хотите получить (индексы отсчитываются с нуля). Например, обращение к следующему методу позволяет получить первый дочерний узел, принадлежащий узлу Element:

FirstNode = Element.childNodes.item(0);

Однако, поскольку item является методом по умолчанию объекта NodeList, вы можете опустить его, как это делалось в предыдущих примерах в этой главе:

FirstNode = Element.childNodes(O);

В таблице 9.4 представлены свойства и методы, предоставляемые объектом NodeList.

Таблица 9.4. Свойство и методы, поддерживаемые групповым объектом NodeList. Доступ к объекту NodeList осуществляется через свойство childNodes узла

Свойство NodeList
Описание
Пример
length
Количество узлов, содержащихся в наборе
NodeCount = Element.childNodes.length;
Метод NodeList
Описание
Пример
item (индекс, отсчитываемый с 0) (метод по умолчанию)
Возвращает узел в соответствии с заданным вами индексом, при этом 0 соответствует первому узлу
SecondChild = Element.childNodes.item (1); или SecondChild = Element.childNodes (1);
reset()
Устанавливает внутренний указатель на позицию перед первым узлом в наборе, чтобы последующий вызов nextNode возвращал первый узел
Element.childNodes.reset ();
nextNode ()
Возвращает следующий узел в наборе в соответствии с позицией внутреннего указателя
Element.childNodes.reset (); FirstNode = Element.childNodes. nextNode ();

 

Извлечение символьных данных элемента

В сценарии, представленном в Листинге 9-3, свойство text каждого из дочерних элементов (TITLE, AUTHOR, BINDING, PAGES и PRICE) используется для получения символьных данных элемента. Например, следующий оператор используется для извлечения символьных данных элемента TITLE:

title.innerText=

Document.documentElement.childNodes(0).text;

Свойство text показывает содержимое элемента в текущем узле, плюс текстовое содержимое любого подчиненного элемента. Оно хорошо подходит для извлечения символьных данных элемента в том случае, если элемент не имеет дочерних элементов (например, элемент TITLE). Однако, если элемент содержит один или более дочерних элементов помимо символьных данных, как в приведенном ниже примере, свойство text возвращает весь текст (в данном случае, «Moby-Dick Or, the Whale»).

<TITLE>Moby-Dick

<SUBTITLE>Or, theWhale</SUBTITLE> 

</TITLE>

Чтобы получить только символьные данные элемента TITLE, вам потребуется осуществить доступ к дочернему узлу Text.

Как видно из таблицы 9.1, свойство nodeValue узла Element имеет значение null. Если элемент содержит символьные данные, то они хранятся в дочернем узле Text, и вы можете получить их через свойство nodeValue узла Text. Например, чтобы получить данные элемента TITLE («Moby-Dick»), из предыдущего примера, без символьных данных, принадлежащих элементу SUBTITLE, используем следующее выражение:

Element.firstChild. nodeValue

(Поскольку символьные данные элемента TITLE предшествуют подчиненному элементу, они представляются первым дочерним узлом, и вы можете извлечь их с помощью свойства firstChild.)

Если символьные данные элемента смешаны с дочерними элементами, комментариями или инструкциями по обработке, каждый отдельный блок символьных данных представляется собственным дочерним узлом Text. Например, приведенный ниже элемент ITEM имеет три дочерних узла, расположенных в следующем порядке: узел TEXT, представляющий первый блок символьных данных; узел ELEMENT, представляющий дочерний элемент SUB-ITEM; еще один узел TEXT, представляющий второй блок символьных данных:

<ITEM>

блок символьных данных № 1 /* узел TEXT */ 

<SUB-ITEM>текст подчиненного элемента</8ив-ПГЕМ> блок символьных данных № 2/* узел TEXT */

</IТЕМ>

Метод и свойство, предоставляемые узлом Text, приведены в таблице 9.5.

Таблица 9.5. Полезные свойство и метод, поддерживаемые узлами Text. Другие доступные свойства вы можете найти в перечне общих свойств в таблице 9.2

Свойство узла Text
Описание
Пример
Length
Количество символов в тексте узла
CharacterCount = Text.length;
Метод узла Text
Описание
Пример
substringData (char-offset, пит-chars)
Возвращает строку, содержащую заданное число символов из текстового содержимого узла, начиная с указанной параметром смещения позиции
Substring = Text.substringData (2, 3);

(Возвращает третий, четвертый и пятый символы из содержимого элемента Text)

 

Отображение переменного числа XML-элементов

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

Например, для XML-документа типа Inventory.xml (см. Листинг 8-1 и файл на CD-ROM) или Inventory Big.xml (см. Листинг 8-3 и файл на CD-ROM) вы обычно не знаете заранее, сколько элементов BOOK содержит документ. Если же количество элементов BOOK меняется, необходимо воспользоваться сценарием.

В Листинге 9-4 представлена HTML-страница, которая использует DOM для отображения документа Inventory.xml вне зависимости от того, сколько элементов BOOK в нем содержится. (Этот листинг вы можете найти на прилагаемом к книге CD-ROM в файле DomDemo Variable.htm.) На следующей странице показано как будет выглядеть страница в Internet Explorer 5.

Листинг 9-4

DomDemo Variable.htm

<!-- Имя файла: DomDemo Variable.htm -->

<HTML>

<HEAD>

<TITLE>Book lnventory<ynTLE>

<SCRIPT LANGUAGE="JavaScript" FOR="windOw" EVENT="ONLOAD"> 

HTMLCode =""; 

Document = dsolnventory.XMLDocument;

for (i=0;

i < Document.documentElement.childNodes.length; 

i++)

{

HTMLCode +=

"<SPAN STYLE='font-style:1talic>>Title: </SPAN>"

+ Document.documentElement.childNodes(i).childNodes(0).text

+"<BR>"

+ "<SPAN STYL£='font-style:italic1>Author: </SPAN>"

+ Document.documentElement.childNodes(i).childNodes(1 ).text

+ "<BR>"

+ "<SPAN STYLE='font-style:italic'>Binding: </SPAN>"

+ Document.documentElement.childNodes(i).childNodes(2).text

+ "<BR>"

+ "<SPAN STYL£='font-style:italic'>Nurnber of pages:"

+ "</SPAN>"

+ Document.documentElement.childNodes(i).childNodes(3).text

+ "<BR>"

+ "<SPAN STYLE='font-style:italic'>Price: </SPAN>"

+ Document.documentElement.childNodes(i).childNodes(4).text

+ "<P>";

}

DisplayDW.innerHTML=HTMLCode; 

</SCRIPT>

</HEAD> 

<BODY>

<XML ID="dsolnventory" SRC="lnventory.xml"X/XML>

<H2>Booklnventory</H2>

<DIV ID="DisplayDIV"></DIV> 

</BODY> 

</HTML>

Сценарий в рассматриваемом примере использует свойство length для определения количества элементов BOOK внутри корневого элемента. (Свойство length является членом группового объекта NodeList, предоставляемого свойством childNodes узла корневого элемента. См. таблицу 9.4.) В сценарии имеется цикл for, который выполняется для каждого элемента BOOK и включает код для отображения каждого из этих элементов:

for (1=0);

i < Document.documentBement.childNodes.tength; 

i++)

{

/* код для отображения элемента BOOK... */

}

Поскольку количество элементов BOOK неизвестно, страница не может использовать фиксированный набор элементов SPAN в разделе BODY для отображений данных (как это делалось в предыдущем примере из Листинга 9-3). Вместо этого для каждого элемента BOOK сценарий динамически генерирует весь блок HTML-разметки, необходимый для отображения элемента:

for (i=0);

i < Document.documentElement.childNodes.length; 

i++)

{

HTMLCode +=

"<SPAN STYLE='font-style:italic1>Title: </SPAN>"

+ Document.documentElement.childNodes(i).childNodes(0).text

+"<BR>"

+ "<SPAN STYLE='font-style:italic1>Author: </SPAN>"

+ Document.documentElement.childNodes(i).childNodes( 1 ).text

+"<BR>"

+ "<SPAN STYLE='font-style:italic'>Binding: </SPAN>"

+ Document.documentElement.childNodes(i).childNodes(2).text

+"<BR>"

+ "<SPAN STYLE='font-style:italic'>Number of pages:"

+ "</SPAN>"

+ Document.documentElement.childNodes(i).childNodes(3).text

+"<BR>"

+ "<SPAN STYLE='font-style:italic'>Price: </SPAN>"

+ Document.documentElement.childNodes(i).childNodes(4).text

+ "<P>";

}

Сценарий хранит все эти блоки HTML-разметки в переменной HTMLCode. После цикла for, когда все блоки сгенерированы и загружены в HTMLCode, сценарий присваивает HTML-разметку свойству innerHTML элемента DIV раздела BODY страницы (этот элемент имеет ID DisplayDIV):

DisplayDrV.innerHTML=HTMLCode;

Элемент DIV затем сразу же получает HTML-разметку и отображает результаты.

Чтобы убедиться, что страница работала независимо от количества элементов BOOK, которое содержится в XML-документе, вы можете отредактировать фрагмент данных на этой странице, чтобы он отображал документ Inventory Big.xml, который содержит в два раза больше элементов BOOK, чем документ Inventory.xml:

<XML ID="dsolnventory" SRC="lnventory Big.xml"></XML>



Опубликовал admin
14 Авг, Суббота 2004г.



Программирование для чайников.