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

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

Доступ к примитивам и нотациям XML

Как говорилось в "Определение и использование примитивов" , вы используете объявление неразбираемого примитива для включения в XML-документ внешних данных. (Все неразбираемые примитивы являются общими внешними примитивами.) При использовании неразбираемого примитива вы назначаете его имя атрибуту типа ENTITY или ENTITIES, что ассоциирует файл внешнего примитива с определенным XML-элементом. XML-процессор не имеет доступа к файлу неразбираемого примитива. Он просто делает описание примитива и его нотацию доступными приложению, которое может получать и соответствующим образом использовать информацию.

В этом разделе вы познакомитесь с XML-документом и HTML-страницей, которые демонстрируют основные этапы в использовании DOM для извлечения из XML-документа информации о примитиве, а также нотации, описывающей формат примитива. Листинг 9.7 содержит пример XML-документа, а Листинг 9.8 содержит пример HTML-страницы.

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

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

<!DOCTYPE INVENTORY
   [
   <!NOTATION TXT SYSTEM "plain text file">
   <!ENTITY rev_huck SYSTEM "Review of Huckleberry Finn.txt" 
      NDATA TXT> 
   <!ENTITY rev_leaves SYSTEM "Review of Leaves of Grass.txt" 
      NDATA TXT>
   <!ENTITY rev_legend SYSTEM "Review of Sleepy Hollow.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="rev_huck">
      <TITLE>The Adventures of Huckleberry Finn</TITLE>
      <AUTHOR>Mark Twain</AUTHOR>
      <BINDING>mass market paperback</BINDING>
      <PAGES>298</PAGES>
      <PRICE>$5.49</PRICE>
   </BOOK>
   <BOOK Review="rev_leaves">
      <TITLE>Leaves of Grass</TITLE>
      <AUTHOR>Walt Whitman</AUTHOR>
      <BINDING>hardcover</BINDING>
      <PAGES>462</PAGES>
      <PRICE>$7.75</PRICE>
   </BOOK>
   <BOOK Review="rev_legend">
      <TITLE>The Legend of Sleepy Hollow</TITLE>
      <AUTHOR>Washington Irving</AUTHOR>
      <BINDING>mass market paperback</BINDING>
      <PAGES>98</PAGES>
      <PRICE>$2.95</PRICE>
   </BOOK>
</INVENTORY>
Листинг 9.7. Inventory Entity.xml
<!-- Имя файла: Inventory Entity.htm -->

<HTML>

<HEAD>
   
   <TITLE>Get Entity Information</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 
        + "' attribute has ENTITY type" + "\n";
     DisplayText += "attribute value = " 
        + Attribute.nodeValue + "\n";
     Entity = 
     Document.doctype.entities.getNamedItem(Attribute.nodeValue);
     DisplayText += "entity file = " 
        + Entity.attributes.getNamedItem("SYSTEM").nodeValue 
        + "\n";
     NotationName = 
        Entity.attributes.getNamedItem("NDATA").nodeValue;
     DisplayText += "entity notation = " + NotationName + "\n";
     Notation = 
        Document.doctype.notations.getNamedItem(NotationName);
     DisplayText += "notation URI or description = " 
        + Notation.attributes.getNamedItem("SYSTEM").nodeValue 
        + "\n";
     alert(DisplayText);
     location.href = 
        Entity.attributes.getNamedItem("SYSTEM").nodeValue;
     }
   </SCRIPT>

</HEAD>

<BODY>

   <XML ID="dsoInventory" SRC="Inventory Entity.xml"></XML>

</BODY>

</HTML>
Листинг 9.8. Inventory Entity.htm

Каждый элемент BOOK в рассматриваемом примере XML-документа содержит атрибут типа ENTITY с именем Review, которому присваивается имя неразбираемого примитива, содержащего обзор для данной книги. Пример HTML-страницы включает сценарий, который демонстрирует основные действия, которые сценарий DOM должен выполнить, чтобы извлечь всю информацию о примитиве при обнаружении атрибута с типом ENTITY или ENTITIES. В частности, сценарий извлекает информацию о неразбираемом примитиве, назначенном атрибуту Review для первого элемента BOOK. Он отображает эту информацию в окне предупреждающего сообщения, как показано на рисунке 9.7.


Рис. 9.7.

Вот краткое пояснение основных действий, выполняемых сценарием:

  1. Сценарий получает узел Attribute для атрибута Review первого элемента BOOK:
    Attribute =
      Document.documentElement.childNodes(0).attributes(0);
  2. Сценарий использует свойство dataType узла (см. таблицу 9.2), чтобы определить, имеет ли атрибут тип ENTITY:
    if  (Attribute.dataType == "entity")
      {
      /* получить информацию из примитива */
      }

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

  3. Сценарий получает узел ENTITY для DTD-объявления примитива, присвоенного атрибуту:
    Entity =
      Document.doctype.entities.getNamedItem(Attribute.nodeValue);

    Свойство doctype объекта Document (см. таблицу 9.3) предоставляет узел DocumentType, представляющий объявление типа документа. Свойство entities узла DocumentType предоставляет набор NamedNodeMap узлов Entity для всех объявлений примитивов в DTD. Узел Entity для конкретного примитива, присваиваемого атрибуту, получают заданием имени примитива ( Attribute.nodeValue ) в качестве параметра метода getNamedItem объекта NamedNodeMap (см. таблицу 9.7).

  4. Сценарий получает системный литерал примитива, который задает URI файла, содержащего данные примитива. Системный литерал хранится как значение узла Attribute с именем SYSTEM:
    DisplayText += "entity file = "
      + 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 += "notation URI or description = "
      + Notation.attributes.getNamedItem("SYSTEM").nodeValue
      + "\n";
  8. Сценарий отображает все хранимые результаты в окне предупреждающего сообщения:
    alert(DisplayText);
  9. Сценарий завершается предоставлением Internet Explorer 5 возможности открыть и отобразить файл примитива, содержащего обзор. Он делает это путем присвоения URI файла (полученного на шаге 4) свойству location.href HTML-страницы, которое задает URL файла, отображаемого в данный момент браузером:
    location.href =
      Entity.attributes.getNamedItem("SYSTEM").nodeValue;

    Свойство location.href является частью объектной модели DHTML, о которой вы можете узнать по адресу http://msdn.microsoft.com/workshop/author/default.asp.

Максим Попов
Максим Попов

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

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

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

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

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

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

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

Спасибо!

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет