Опубликован: 24.01.2007 | Уровень: для всех | Доступ: платный
Лекция 9:

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

Использование других способов доступа к элементам

В рассмотренных примерах сценариев доступ к узлам Element в иерархической структуре осуществлялся с использованием свойств childNodes или firstChild узла. При этом происходил переход от одного узла к другому. Аналогичным образом вы можете применять свойства узла lastChild, previousSibling, nextSibling и parentNode (см. таблицу 9.2).

Примечание. Свойства childNodes, firstChild и lastChild дают возможность доступа только к дочерним узлам, которые не являются атрибутами, в то время как свойства previousSibling и nextSibling могут быть использованы для доступа к вершинному узлу любого типа.

Другим способом доступа к XML-элементам является использование свойства getElementsByTagName, которое позволяет извлечь все элементы, имеющие определенное имя типа (например, TITLE ). Этот метод может использоваться для узла Document (см. таблицу 9.3), а также для узла Element (см. таблицу 9.6). Если вы обращаетесь к методу для узла Document, он возвращает набор узлов Element для всех элементов в документе, обладающих заданным именем типа. Например, следующий оператор позволяет получить группу узлов для всех элементов в документе, обладающих именем BOOK:

NodeList = Document.getElementsByTagName("BOOK");

Если вы обращаетесь к методу getElementsByTagName для узла Element, как в следующем примере, он возвращает набор узлов для всех соответствующих элементов, которые являются подчиненными для узла Element:

NodeList = Element.getElementsByTagName("AUTHOR");

Подсказка. Если в качестве параметра метода getElementsByTagName вы укажете "*", то метод вернет набор узлов для всех элементов (всех элементов в документе, если вы вызываете метод для объекта Document, и всех подчиненных элементов, если вы вызываете метод для объекта Element ).

Таблица 9.6. Полезные методы, поддерживаемые узлами Element. Для узлов Element вы также можете применять общие свойства узлов, приведенные в таблице 9.2
Метод узла Element Описание Пример
getAttribute(имя-атр) Возвращает значение атрибута элемента с заданным именем AttValue = Element.getAttribute("InStock");
getAttributeNode(имя-атр) Возвращает узел Attribute, представляющий атрибут элемента с заданным именем Attribute = Element.getAttributeNode("InStock");
getElementsByTagName(имя-типа) Возвращает набор NodeList узлов Element для всех подчиненных элементов элемента с заданным именем. Если указано "*", возвращает узлы для всех подчиненных элементов AuthorElementCollection = Element.getElementsByTagName("AUTHOR");

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

for (i=0; i < NodeList.length; ++i)
  alert(NodeList(i).text);

HTML-страница из Листинга 9.5 демонстрирует использование метода getElementsByTagName для узла Document. Страница отображает поле ввода INPUT типа Text, которое дает вам возможность ввести имя элемента. Когда вы щелкаете мышью на кнопке Show Elements, вызывается функция ShowElements сценария, которая использует метод getElementsByTagName для узла Document, чтобы найти и отобразить XML-разметку для всех элементов в документе, которые носят введенное вами имя элемента (если они имеются). Заметим, что сценарий использует свойство xml каждого из узлов Element для отображения содержимого XML-разметки элемента. Страница изначально связана с документом Inventory.xml, хотя вы можете отредактировать фрагмент данных, чтобы отобразить элементы из другого XML-документа. На рисунке 9.4 показано как Internet Explorer 5 отобразит страницу после того, как вы ввели в поле ввода INPUT имя AUTHOR и щелкнули мышью на кнопке Show Elements.


Рис. 9.4.
<!-- Имя файла: GetElements.htm -->

<HTML>

<HEAD>

   <TITLE>Element Finder</TITLE>

   <SCRIPT LANGUAGE="JavaScript">
      function ShowElements()
         {
         /* проверка ввода пользователем названия элемента в поле 
            'Element name': */
         if (ElementName.value == "")
            {
            ResultDiv.innerText = "<You must enter an element "    
               + "name into 'Element name' box.>";
            return;
            }

         /* создание списка элементов NodeList с именами, аналогичными
            введенному: */
         Document = dsoXML.XMLDocument;
         NodeList = 
            Document.getElementsByTagName(ElementName.value);
        
         /* запись XML указателя для каждого найденного элемента
            в ResultHTML: */
         ResultHTML = "";
         for (i=0; i < NodeList.length; ++i)
            ResultHTML += NodeList(i).xml + "\n\n";

         /* назначение сохраненных результатов в свойстве innerText
            элемента DIV: */
         if (ResultHTML == "")
            ResultDiv.innerText = "<no matching elements found>";
         else
            ResultDiv.innerText = ResultHTML;
         }
   </SCRIPT>
   
</HEAD>

<BODY>

   <XML ID="dsoXML" SRC="Inventory.xml"></XML>

   <H2>Find Elements by Element Name</H2>
   Element name: <INPUT TYPE="Text" ID="ElementName">&nbsp
   <BUTTON ONCLICK="ShowElements()">Show Elements</BUTTON>
   <HR>
   <DIV ID=ResultDiv></DIV>
   
</BODY>

</HTML>
Листинг 9.5. GetElements.htm

Доступ и отображение значений атрибутов в XML-документе

Атрибут, который содержится в XML-элементе, представляется дочерним узлом Attribute. Однако вы не сможете обратиться к дочернему узлу Attribute с использованием свойств childNodes, firstChild или lastChild, которые годятся для доступа к дочерним узлам других типов. Вместо этого вам потребуется воспользоваться свойством attributes узла Element.

Примечание. DOM использует узлы Attribute для представления не только атрибутов, но и нескольких типов других компонентов XML, которые состоят из пар имя-значение, а именно:

  • имя и значение в инструкции по обработке (например, version="1.0" в XML-объявлении);
  • ключевое слово SYSTEM, за которым следует системный литерал в объявлении типа документа, объявлении внешнего примитива, либо в объявлении нотации;
  • ключевое слово NDATA, за которым следует имя нотации в объявлении неразбираемого примитива.

Возьмем в качестве примера XML-документ из Листинга 9.6.

<?xml version="1.0" encoding="windows-1251" ?>

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

<INVENTORY>
   <BOOK Binding="mass market paperback" InStock="yes" 
      Review="***">
      <TITLE>The Adventures of Huckleberry Finn</TITLE>
      <AUTHOR Born="1835">Mark Twain</AUTHOR>
      <PAGES>298</PAGES>
      <PRICE>$5.49</PRICE>
   </BOOK>
   <BOOK Binding="hardcover" InStock="no">
      <TITLE>Leaves of Grass</TITLE>
      <AUTHOR Born="1819">Walt Whitman</AUTHOR>
      <PAGES>462</PAGES>
      <PRICE>$7.75</PRICE>
   </BOOK>
   <BOOK Binding="mass market paperback" InStock="yes" 
      Review="****">
      <TITLE>The Legend of Sleepy Hollow</TITLE>
      <AUTHOR>Washington Irving</AUTHOR>
      <PAGES>98</PAGES>
      <PRICE>$2.95</PRICE>
   </BOOK>
</INVENTORY>
Листинг 9.6. Inventory Attributes.xml

Элементы BOOK в этом документе имеют от двух до трех атрибутов. Следующее выражение в сценарии получает узел для первого элемента BOOK:

Document.documentElement.childNodes(0)

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

Свойство attributes данного узла Element предоставляет набор NamedNodeMap узлов Attribute для всех атрибутов, принадлежащих первому элементу BOOK:

NamedNodeMap = Document.documentElement.childNodes(0).attributes

Групповой объект NamedNodeMap несколько отличается от группового объекта NodeList, предоставляемого свойством узла childNodes. В таблице 9.7 приведены свойство и несколько полезных методов, предоставляемых объектами NamedNodeMap.

Таблица 9.7. Свойство и некоторые полезные методы, предоставляемы групповым объектом NamedNodeMap. Свойство attributes узла предоставляет объект NamedNodeMap
Свойство NamedNodeMap Описание Пример
length Количество узлов, содержащихся в наборе AttributeCount = Element.attributes.length;
Метод NamedNodeMap Описание Пример
getNamedItem(имя-атр) Возвращает узел, который носит заданное имя Attribute = Element.attributes.getNamedItem("Binding");
item(индекс, отсчитываемый от нуля) (метод по умолчанию) Возвращает узел в заданной индексом позиции (0 соответствует первому узлу) SecondAttribute = Element.attributes.item(1); или SecondAttribute = Element.attributes(1);
reset() Устанавливает внутренний указатель на позицию перед первым узлом в наборе, так что последующий вызов nextNode возвращает первый узел Element.attributes.reset();
nextNode() Возвращает следующий узел в наборе в соответствии со значением внутреннего указателя Element.attributes.reset(); FirstAttribute = Element.attributes.nextNode();

Вы можете воспользоваться свойством length объекта NamedNodeMap и установленным по умолчанию методом item, чтобы перемещаться внутри набора и извлекать отдельные узлы Attribute. Например, следующий фрагмент сценария отображает имя и значение каждого атрибута для первого элемента BOOK рассматриваемого документа:

NamedNodeMap = Document.documentElement.childNodes(0).attributes;
for (i=0; i<NamedNodeMap.length; ++i)
  alert("node name: " + NamedNodeMap(i).nodeName + "\n"
  + "node value: " + NamedNodeMap(i).nodeValue);

Каждая пара имя-значение отображается в окне сообщения-предупреждения. На рисунке 9.5 показано как оно выглядит.


Рис. 9.5.

Обратите внимание, что свойство nodeName узла Attribute содержит имя атрибута, в то время как свойство nodeValue содержит значение атрибута.

Примечание. В действительности узел Attribute имеет дочерний узел Text, который содержит значение атрибута. Однако этот узел практически не нужен, поскольку вы легко можете получить значение атрибута из свойства nodeValue узла Attribute. В связи с этим данный тип дочернего узла Text в этой лекции не рассматривается.

Вы можете извлечь определенный узел Attribute из объекта NamedNodeMap, вызвав метод getNamedItem данного объекта. Например, следующий фрагмент кода сценария отображает значение атрибута Binding первого элемента BOOK в рассматриваемом документе:

NamedNodeMap = Document.documentElement.childNodes(0).attributes;
    alert(NamedNodeMap.getNamedItem("Binding").nodeValue);

На рисунке 9.6 показано как выглядит предупреждающее сообщение.


Рис. 9.6.
Максим Попов
Максим Попов

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

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

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

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

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

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

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

Спасибо!

Максим Самсоненко
Максим Самсоненко
Россия
Алексей Шибаев
Алексей Шибаев
Россия, г. Новошахтинск