Структура DOM
В DOM программные объекты, представляющие XML-документ, называются узлами. Когда Internet Explorer 5 обрабатывает связанный XML-документ и сохраняет его в DOM, он создает узел для каждого из основных компонентов XML-документов, таких как элементы, атрибуты и инструкции по обработке.
DOM использует различные типы узлов для представления различных типов компонентов XML. Например, элемент хранится в узле Element, а атрибут – в узле Attribute. В таблице 9.1 представлены наиболее важные типы узлов.
Document | Корневой узел иерархии документа (т. е. он представляет весь XML-документ) | #document | null |
Element | Элемент | Имя типа элемента (например, BOOK) | null (любые символьные данные, содержащиеся в элементе, находятся в одном или нескольких дочерних узлах Text) |
Text | Текст, принадлежащий элементу, атрибуту или примитиву, которые представлены родителем этого узла | #text | Текст родительского XML-компонента |
Attribute | Атрибут (а также другие пары имя-значение, такие как имя и значение в инструкции по обработке) | Имя атрибута (например, Binding) | Значение атрибута (например, hardcover) |
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) |
Каждый узел, как программный объект, имеет свойства и методы, которые позволяют вам осуществлять доступ, отображать, обрабатывать и получать информацию о соответствующем компоненте XML. Например, свойства nodeName и nodeValue (см. таблицу 9.1) дают имя компонента и его значение.
Все типы узлов используют общий набор свойств и методов. Эти свойства и методы разработаны для работы с узлами вообще. В таблице 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-документу. Вы можете использовать его для доступа к другим узлам. В последующих разделах вы познакомитесь с особыми способами доступа к узлам.