Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_XML.doc
Скачиваний:
16
Добавлен:
03.05.2019
Размер:
3.94 Mб
Скачать

Лабораторная работа №12

  1. Используя структуру DOM, создайте на HTML-странице сценарий для извлечения и отображения значений атрибутов в браузере XML-документа из лабораторной работы №5.

  2. Добавьте к данному сценарию возможность поиска элементов с атрибутами.

  3. Оформите HTML-страницу по согласованию с преподавателем.

  4. Сохраните XML-документ и HTML-страницу в папке под своей фамилией.

  5. Откройте для просмотра созданную HTML-страницу в браузере Internet Explorer.

  6. При появлении сообщений об ошибках, постарайтесь их найти и устранить.

  7. Сдайте работу преподавателю.

7.10. Перемещение внутри xml-документа

Ниже в листинге 1.33 представлен пример HTML-страницы , которая содержит сценарий для перемещения внутри XML-документа из листинга 1.27 среди узлов в иерархии DOM, начиная с корневого элемента Document. Для каждого узла сценарий отображает имя узла, тип и значение. Сценарий задает отступ для каждого блока информации в узле, чтобы показать его уровень в иерархии. Эту страницу можно использовать, чтобы отобразить узлы для любого XML-документа и лучше узнать, как DOM структурирует узлы для различных типов XML-документов и компонентов документа.

<HTML>

<HEAD>

<TITLE>Отображение узлов DOM</TITLE>

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

/* получить узел Document: */

Document = dsoXML.XMLDocument;

/* передача узла Document функции */

DisplayDIV.innerText = DisplayNodes(Document, 0);

function DisplayNodes(Node, IndentLevel)

{

/* объявить локальные переменные для рекурсии: */

var i;

var DisplayString ="";

/* создание отступа для данного уровня: */

Indent =""; IndentDelta =" ";

For (i=0; i < IndentLevel; ++i)

Indent += IndentDelta;

/* отображение свойств текущего узла: */

DisplayString += Indent + "Имя узла: " + Node.nodeName + "\n"

+ Indent + "Тип узла: " + Node.nodeType+ "\n"

+ Indent + "Тип строки узла: " + Node.nodeTypeString+ "\n"

+ Indent + "Значение узла: " + Node.nodeValue+ "\n\n";

/* отображение атрибутов для каждого из дочерних узлов: */

Indent += IndentDelta;

for (i=0; Node.attributes != null && i < Node.attributes.length; ++i)

DisplayString += Indent + " Имя узла: " + Node.attributes(i).nodeName + "\n"

+ Indent + " Тип узла: " + Node.attributes(i).nodeType + "\n"

+ Indent + " Тип строки узла: " + Node.attributes(i).nodeTypeString + "\n"

+ Indent + " Значение узла: " + Node.attributes(i).nodeValue + "\n\n";

/* отображение каждого из дочерних узлов, не являющихся атрибутами: */

for (i=0; i < Node.childNodes.length; ++i)

DisplayString +=DisplayNodes(Node.childNodes(i), IndentLevel + 1);

/* возврат строки, содержащей результаты: */

return DisplayString;

}

</SCRIPT>

</HEAD>

<BODY>

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

<H2>Узлы объектной модели XML-документа</H2>

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

</BODY>

</HTML>

Листинг 1.33

В начале сценарий передает узел Document функции DisplayNodes, которая возвращает отображаемую.информацию данного узла и всех его дочерних узлов. Сценарий присваивает отображаемую информацию свойству innerText элемента DIV в разделе BODY страницы, который затем отображает эту информацию:

DisplayDIV.innerText = DisplayNodes(Document, 0);

Второй параметр функции DisplayNodes задает уровень отступа, используемого при отображении информации узла. Функция DisplayNodes имеет следующую форму записи:

function DisplayNodes (Node, IndentLevel)

Функция выполняет следующие основные действия:

  • Она сохраняет соответствующее количество символов пробелов в переменной Indent, которая используется для создания отступа в начале каждой строки текста узла. Количество символов пробелов определяется значением параметра IndentLevel, передаваемого функции DisplayNodes:

/* создание отступа для данного уровня: */

Indent ="";

IndentDelta =" ";

for (i=0; i < IndentLevel; ++i);

Indent += IndentDelta;

  • Она сохраняет отображаемую информацию для текущего узла - т. е. узла, передаваемого функции DisplayNodes через параметр Node (изначально, узел Document):

/* отображение свойств текущего узла: */

DisplayString += Indent + "Имя узла: " + Node.nodeName + "\n"

+ Indent + "Тип узла: " + Node.nodeType + "\n"

+ Indent + "Тип строки узла: " + Node.nodeTypeString + "\n"

+ Indent + "Значение узла: " + Node.nodeValue + "\n\n";

При необходимости увидеть дополнительные свойства для каждого узла, их можно добавить в представленный выше фрагмент кода. Можно использовать любые общие свойства узла, приведенные в таблице 5.21. Однако не следует использовать специальные свойства, характерные для определенного узла (они приведены в таблице 5.22 для узлов Document), поскольку они применимы не для всех типов узлов.

  • Она сохраняет отображаемую информацию для дочерних узлов Attribute текущего узла. Отступ при этом увеличивается на один уровень, указывая на то, что эти узлы являются дочерними для текущего узла:

/* отображение атрибутов для каждого из дочерних узлов: */

Indent += IndentDelta;

for(i=0; Node.attributes != null && i < Node.attributes.length; ++i)

DisplayString += Indent + "Имя узла: " + Node.attributes(i).nodeName + "\n"

+ Indent + "Тип узла: " + Node.attributes(i).nodeType + "\n"

+ Indent + "Тип строки узла: " + Node.attributes(i).nodeTypeString + "\n"

+ Indent + "Значение узла: " + Node.attributes(i).nodeValue + "\n\n";

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

  • Функция DisplayNodes сохраняет отображаемую информацию для каждого дочернего узла, не являющегося атрибутом, осуществляя самостоятельный вызов для каждого из этих узлов. Такой вызов называется рекурсивным:

/* отображение каждого из дочерних узлов, не являющихся атрибутами: */

for (i=0; i < Node.childNodes.length; ++i)

DisplayString += DisplayNodes (Node.childNodes(i), IndentLevel + 1);

  • Функция DisplayNodes завершает свою работу, возвращая строку, содержащую всю информацию об узле:

/* возврат строки, содержащей результаты: */

return DisplayString;

При отображении страницы в Internet Explorer свойство nodeTypeString содержит тип узла в виде строчных букв. (Так, “Document” и “Processing-Instruction” превращаются в “document” и “processinginstruc-tion”.) Первая часть отображаемых результатов выглядит, как показано на рисунке 53.

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

<XMLID="dsoXML" SRC="Inventory05.xml"></XML>

Рисунок 53. Отображение структуры узлов XML-документа из листинга 1.27