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

7.9. Доступ к примитивам и нотациям 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);

  1. Сценарий использует свойство dataType узла (см. таблицу 5.21), чтобы определить, имеет ли атрибут тип ENTITY:

if (Attribute.dataType == "entity")

{

/* получить информацию из примитива */

}

Сценарий выполняет остальные действия только в том случае, если атрибут имеет тип ENTITY. Т.е. эти действия, входящие в состав оператора if, выполняют только тогда, когда условие if истинно.

  1. Сценарий получает узел 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).

  1. Сценарий получает системный литерал примитива, который задает URI файла, содержащего данные примитива. Системный литерал хранится как значение узла Attribute с именем SYSTEM:

DisplayText += "Файл примитива ="

+ Entity.attributes.getNamedItem("SYSTEM").nodeValue + "\n";

  1. Сценарий получает имя нотации примитива, которое хранится как значение узла Attribute с именем NDATA:

NotationName =

Entity.attributes.getNamedItem("NDATA").nodeValue;

  1. Сценарий получает узел Notation для объявления нотации примитива:

Notation = Document.doctype.notations.getNamedItem(NotationName);

Свойство notations узла DocumentType предоставляет набор NamedNodeMap узлов Notation для всех объявлений нотаций в DTD. Узел Notation для нотации примитива получают путем задания имени нотации (NotationName) в качестве параметра метода getNamedItem объекта NamedNodeMap.

  1. Сценарий получает системный литерал нотации, который содержит URI нотации или — в данном примере — ее описание. Системный литерал хранится как значение узла Attribute с именем SYSTEM:

DisplayText += "URI или описание нотации ="

+ Notation.attributes.getNamedltem("SYSTEM").nodeValue + "\n";

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

alert(DisplayText);

  1. Сценарий завершается предоставлением Internet Explorer возможности открыть и отобразить файл примитива, содержащего обзор. Он делает это путем присвоения URI файла (полученного на шаге 4) свойству location.href HTML-страницы, которое задает URL файла, отображаемого в данный момент браузером:

location. href = Entity.attributes.getNamedltem("SYSTEM").nodeValue;