Опубликован: 24.01.2007 | Доступ: свободный | Студентов: 9683 / 1719 | Оценка: 4.28 / 4.09 | Длительность: 20:51:00
Лекция 9:

Отображение XML-документов с использованием сценариев объектной модели документа

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

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

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

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


Рис. 9.1.
<?xml version="1.0" encoding="windows-1251" ?>

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

<INVENTORY>
   <BOOK Binding="mass market paperback">
      <TITLE>The Adventures of Huckleberry Finn</TITLE>
      <AUTHOR Born="1835">Mark Twain</AUTHOR>
      <PAGES>298</PAGES>
      <PRICE>$5.49</PRICE>
   </BOOK>
   <BOOK Binding="trade paperback">
      <TITLE>The Marble Faun</TITLE>
      <AUTHOR Born="1804">Nathaniel Hawthorne</AUTHOR>
      <PAGES>473</PAGES>
      <PRICE>$10.95</PRICE>
   </BOOK>
   <BOOK Binding="hardcover">
      <TITLE>Moby-Dick</TITLE>
      <AUTHOR Born="1819">Herman Melville</AUTHOR>
      <PAGES>724</PAGES>
      <PRICE>$9.95</PRICE>
   </BOOK>
</INVENTORY>
Листинг 9.1. Inventory Dom.xml

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

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

Таблица 9.2. Некоторые полезные свойства, поддерживаемые всеми типами узлов
Свойство Описание Пример
attributes Множество NamedNodeMap всех дочерних узлов-атрибутов данного узла 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;
nodeTypeString Строка, содержащая тип данного узла, строчными буквами (например, "element" или "attribute") NodeTypeString = Node.nodeTypeString;
nodeValue Значение данного узла (или null, если он не содержит значения) AttributeValue = Attribute.nodeValue;
ownerDocument Корневой узел Document документа, содержащего данный узел Document = Node.ownerDocument;
parentNode Узел, для которого данный узел является дочерним (не действует для узла Attribute ) ParentElement = Element.parentNode;
previousSibling Предыдущий узел на том же уровне данного узла PreviousElement = Element.previousSibling;
text Все текстовое содержимое данного узла и всех подчиненных узлов Element AllCharacterData = 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, следующий код приведет к отображению содержимого комментария, расположенного в начале документа (этот комментарий DOM хранит как второй дочерний узел узла Document ):

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

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

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

Максим Попов
Максим Попов

Почему при использовании скриптов, приведенных в курсе Основы XML

лекция Лекция 8: 

Отображение XML-документов с использованием связывания данных

не происходит связывания XLM документа с HTML?

Отображаются пустые поля. Браузер IE11

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!