Почему при использовании скриптов, приведенных в курсе Основы XML лекция Лекция 8: Отображение XML-документов с использованием связывания данных не происходит связывания XLM документа с HTML? Отображаются пустые поля. Браузер IE11 |
Отображение XML-документов с использованием сценариев объектной модели документа
Перемещение внутри XML-документа
В следующем упражнении вы создадите HTML-страницу, которая содержит сценарий для перемещения внутри XML-документа среди узлов в иерархии DOM, начиная с корневого элемента Document. Для каждого узла сценарий отображает имя узла, тип и значение. Сценарий задает отступ для каждого блока информации в узле, чтобы показать его уровень в иерархии. Вы можете использовать эту страницу, чтобы отобразить узлы для любого XML-документа и лучше узнать, как DOM структурирует узлы для различных типов XML-документов и компонентов документа.
Создайте страницу для перемещения между узлами
- Откройте новый, пустой текстовый файл в вашем текстовом редакторе и введите HTML-страницу, представленную в Листинге 9.9.
- Воспользуйтесь командой Save (Сохранить) вашего текстового редактора, чтобы сохранить документ на вашем жестком диске, присвоив ему имя файла ShowNodes.htm.
<!-- Имя файла: ShowNodes.htm --> <HTML> <HEAD> <TITLE>Show DOM Nodes</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 + "nodeName: " + Node.nodeName + "\n" + Indent + "nodeType: " + Node.nodeType + "\n" + Indent + "nodeTypeString: " + Node.nodeTypeString + "\n" + Indent + "nodeValue: " + Node.nodeValue + "\n\n"; /* отображение атрибутов для каждого из дочерних узлов: */ Indent += IndentDelta; for (i=0; Node.attributes != null && i < Node.attributes.length; ++i) DisplayString += Indent + "nodeName: " + Node.attributes(i).nodeName + "\n" + Indent + "nodeTypeType: " + Node.attributes(i).nodeType + "\n" + Indent + "nodeTypeString: " + Node.attributes(i).nodeTypeString + "\n" + Indent + "nodeValue: " + 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="Inventory Dom.xml"></XML> <H2>XML Document Object Model (DOM) Nodes</H2> <DIV ID="DisplayDIV"></DIV> </BODY> </HTML>
Листинг 9.9. ShowNodes.htmВ начале сценарий передает узел Document функции DisplayNodes, которая возвращает отображаемую информацию данного узла и всех его дочерних узлов. Сценарий присваивает отображаемую информацию свойству innerText элемента DIV DisplayDIV в разделе 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 + "nodeName: " + Node.nodeName + "\n" + Indent + "nodeTypeType: " + Node.nodeType + "\n" + Indent + "nodeTypeString: " + Node.nodeTypeString + "\n" + Indent + "nodeValue: " + Node.nodeValue + "\n\n";
Подсказка. Если вы хотите увидеть дополнительные свойства для каждого узла, то можете добавить их в представленный выше фрагмент кода. Вы можете использовать любые общие свойства узла, приведенные в таблице 9.2. Однако не следует использовать специальные свойства, характерные для определенного узла (они приведены в таблице 9.3 для узлов Document ), поскольку они применимы не для всех типов узлов.
- Она сохраняет отображаемую информацию для дочерних узлов Attribute текущего узла. Отступ при этом увеличивается на один уровень, указывая на то, что эти узлы являются дочерними для текущего узла:
/* отображение атрибутов для каждого из дочерних узлов: */ Indent += IndentDelta; for (i=0; Node.attributes != null && i < Node.attributes.length; ++i) DisplayString += Indent + "nodeName: " + Node.attributes(i).nodeName + "\n" + Indent + "nodeTypeType: " + Node.attributes(i).nodeType + "\n" + Indent + "nodeTypeString: " + Node.attributes(i).nodeTypeString + "\n" + Indent + "nodeValue: " + 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;
- Она сохраняет соответствующее количество символов пробелов в переменной Indent, которая используется для создания отступа в начале каждой строки текста узла. Количество символов пробелов определяется значением параметра IndentLevel, передаваемого функции DisplayNodes:
- Откройте страницу в Internet Explorer 5.
Обратите внимание, что свойство nodeTypeString содержит тип узла в виде строчных букв. (Так, "Document" и "ProcessingInstruction" превращаются в "document" и "processinginstruction".)
Изначально страница отображает XML-документ Inventory Dom.xml (см. Листинг 9.1). Первая часть отображаемых результатов выглядит как показано на рисунке 9.8.
- Чтобы просмотреть структуру узлов для других XML-документов, отредактируйте фрагмент данных страницы. Например, чтобы просмотреть узлы документа Inventory Valid Entity.xml (см. Листинг 6.1), вы должны изменить фрагмент данных следующим образом:
<XML ID="dsoXML" SRC="Inventory Valid Entity.xml"></XML>