![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Доступ к примитивам и нотациям XML
Объявление не разбираемого примитива используется для включения в XML-документ внешних данных. (Все не разбираемые примитивы являются общими внешними примитивами.) При использовании не разбираемого примитива его имя назначается атрибуту типа ENTITY или ENTITIES, что ассоциирует файл внешнего примитива с определенным XML-элементом. XML-процессор не имеет доступа к файлу не разбираемого примитива. Он просто делает описание примитива и его нотацию доступными приложению, которое может получать и соответствующим образом использовать информацию. В этом разделе будет рассмотрен XML-документ и HTML-страница, которые демонстрируют основные этапы в использовании DOM для извлечения из XML-документа информации о примитиве, а также нотации, описывающей формат примитива. Листинг 1.31 содержит пример XML-документа, а Листинг 1.32 содержит пример HTML-страницы.
<?xml version="1.0"?> <!-- Имя файла: Inventory08.xml --> <!DOCTYPE INVENTORY [ <!NOTATION TXT SYSTEM "Обычный текстовый файл"> <!ENTITY First SYSTEM "Обзор_Войны_и_мира.txt" NDATA TXT> <!ENTITY Second SYSTEM "Обзор_Преступления_и_наказания.txt" NDATA TXT> <!ENTITY Third SYSTEM "Обзор_Королевы_Марго.txt" NDATA TXT> <!ELEMENT INVENTORY (BOOK)*> <!ELEMENT BOOK (TITLE, AUTHOR, BINDING, PAGES, PRICE)> <!ATTLIST BOOK Review ENTITY #IMPLIED> <!ELEMENT TITLE (#PCDATA)> <!ELEMENT AUTHOR (#PCDATA)> <!ELEMENT BINDING (#PCDATA)> <!ELEMENT PAGES (#PCDATA)> <!ELEMENT PRICE (#PCDATA)> ] > <INVENTORY> <BOOK Review="First"> <TITLE>Война и мир</TITLE> <AUTHOR>Лев Толстой</AUTHOR> <BINDING>Жёсткая обложка</BINDING> <PAGES>510</PAGES> <PRICE>12 000 рублей</PRICE> </BOOK> <BOOK Review="Second"> <TITLE>Преступление и наказание</TITLE> <AUTHOR>Фёдор Достоевский</AUTHOR> <BINDING>Жёсткая обложка</BINDING> <PAGES>590</PAGES> <PRICE>14 000 рублей</PRICE> </BOOK> <BOOK Review="Third"> <TITLE>Королева Марго</TITLE> <AUTHOR>Александр Дюма</AUTHOR> <BINDING>Мягкая обложка</BINDING> <PAGES>410</PAGES> <PRICE>10 000 рублей</PRICE> </BOOK> </INVENTORY> Листинг 1.31
<HTML> <HEAD> <TTTLE>Получение информации о первом примитиве</TITLE> <SCRIPT LANGUAGE="JavaScript" FOR="window" EVENT="ONLOAD"> Document = dsoInventory.XMLDocument; Attribute = Document.documentElement.childNodes(0).attributes(0); if (Attribute.dataType == "entity") { DisplayText ="Атрибут '" + Attribute.nodeName + "' имеет тип ENTITY" + "\n"; DisplayText += "Значение атрибута =" + Attribute.nodeValue + "\n"; Entity =Document.doctype.entities.getNamedItem(Attribute.nodeValue); DisplayText += "Файл примитива =" + Entity.attributes.getNamedItem("SYSTEM").nodeValue + "\n"; NotationName = Entity.attributes.getNamedItem("NDATA").nodeValue; DisplayText += "Нотация примитива =" + NotationName + "\n"; Notation = Document.doctype.notations.getNamedItem(NotationName); DisplayText += "URI или описание нотации =" + Notation.attributes.getNamedItem("SYSTEM").nodeValue + "\n"; alert (DisplayText); location.href = Entity.attributes.getNamedItem("SYSTEM").nodeValue; } </SCRIPT> </HEAD> <BODY> <XML ID="dsoInventory" SRC="Inventory08.xml"></XML> </BODY> </HTML> Листинг 1.32
Каждый элемент BOOK в рассматриваемом примере XML-документа содержит атрибут типа ENTITY с именем Review, которому присваивается имя не разбираемого примитива, содержащего обзор для данной книги. Пример HTML-страницы включает сценарий, который демонстрирует основные действия, которые сценарий DOM должен выполнить, чтобы извлечь всю информацию о примитиве при обнаружении атрибута с типом ENTITY или ENTITIES. В частности, сценарий извлекает информацию о не разбираемом примитиве, назначенном атрибуту Review для первого элемента BOOK. Он отображает эту информацию в окне предупреждающего сообщения, как показано на следующем рисунке. Рисунок 52. Отображение информации о первом примитиве
Вот краткое пояснение основных действий, выполняемых сценарием: 1. Сценарий получает узел Attribute для атрибута Review первого элемента BOOK:
Attribute = Document.documentElement.childNodes(0).attributes(0);
2. Сценарий использует свойство dataType узла (см. таблицу 5.21), чтобы определить, имеет ли атрибут тип ENTITY:
if (Attribute.dataType == "entity") { /* получить информацию из примитива */ }
Сценарий выполняет остальные действия только в том случае, если атрибут имеет тип ENTITY. Т.е. эти действия, входящие в состав оператора if, выполняют только тогда, когда условие if истинно. 3. Сценарий получает узел ENTITY для DTD-объявления примитива, присвоенного атрибуту:
Entity = Document.doctype.entities.getNamedItem(Attribute.nodeValue);
Свойство doctype объекта Document (см. таблицу 5.22) предоставляет узел DocumentType, представляющий объявление типа документа. Свойство entities узла DocumentType предоставляет набор NamedNodeMap узлов Entity для всех объявлений примитивов в DTD. Узел Entity для конкретного примитива, присваиваемого атрибуту, получают заданием имени примитива (Attribute.nodeValue) в качестве параметра метода getNamedItem объекта NamedNodeMap (см. таблицу 5/26). 4. Сценарий получает системный литерал примитива, который задает URI файла, содержащего данные примитива. Системный литерал хранится как значение узла Attribute с именем SYSTEM:
DisplayText += "Файл примитива =" + Entity.attributes.getNamedItem("SYSTEM").nodeValue + "\n";
5. Сценарий получает имя нотации примитива, которое хранится как значение узла Attribute с именем NDATA:
NotationName = Entity.attributes.getNamedItem("NDATA").nodeValue;
6. Сценарий получает узел Notation для объявления нотации примитива:
Notation = Document.doctype.notations.getNamedItem(NotationName);
Свойство notations узла DocumentType предоставляет набор NamedNodeMap узлов Notation для всех объявлений нотаций в DTD. Узел Notation для нотации примитива получают путем задания имени нотации (NotationName) в качестве параметра метода getNamedItem объекта NamedNodeMap. 7. Сценарий получает системный литерал нотации, который содержит URI нотации или — в данном примере — ее описание. Системный литерал хранится как значение узла Attribute с именем SYSTEM:
DisplayText += "URI или описание нотации =" + Notation.attributes.getNamedltem("SYSTEM").nodeValue + "\n";
8. Сценарий отображает все хранимые результаты в окне предупреждающего сообщения:
alert(DisplayText);
9. Сценарий завершается предоставлением Internet Explorer возможности открыть и отобразить файл примитива, содержащего обзор. Он делает это путем присвоения URI файла (полученного на шаге 4) свойству location.href HTML-страницы, которое задает URL файла, отображаемого в данный момент браузером:
location. href = Entity.attributes.getNamedltem("SYSTEM").nodeValue;
Лабораторная работа №12
1. Используя структуру DOM, создайте на HTML-странице сценарий для извлечения и отображения значений атрибутов в браузере XML-документа из лабораторной работы №5. 2. Добавьте к данному сценарию возможность поиска элементов с атрибутами. 3. Оформите HTML-страницу по согласованию с преподавателем. 4. Сохраните XML-документ и HTML-страницу в папке под своей фамилией. 5. Откройте для просмотра созданную HTML-страницу в браузере Internet Explorer. 6. При появлении сообщений об ошибках, постарайтесь их найти и устранить. 7. Сдайте работу преподавателю.
![]() |