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

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

Использование связывания данных по одной записи

Связывание данных по одной записи используется для HTML-элементов, которые не являются таблицами и не включены в связанную таблицу. HTML-элемент – например, SPAN, BUTTON или LABEL – связывается с отдельным полем XML. После этого HTML-элемент автоматически отображает содержимое поля XML, с которым он связан (сцеплен). Например, следующий HTML-элемент SPAN сцеплен с полем TITLE XML-документа, доступ к которому осуществляется через фрагмент данных dsoBook:

<SPAN DATASRC="#dsoBook" DATAFLD="TITLE"></SPAN>

Поскольку данный HTML-элемент не имеет множественных частей, подобно таблице, он способен отобразить значение поля только для одной записи за раз. Чтобы использовать связывание данных по одной записи, XML-документ должен быть организован как простой набор записей. (См. раздел "Использование одной HTML-таблицы для отображения простого набора записей" в начале этой лекции.)

Наипростейшим случаем связывания данных по одной записи является случай, когда XML-документ состоит только из одной записи, подобно документу из Листинга 8.7.

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

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

<BOOK>
   <TITLE>The Adventures of Huckleberry Finn</TITLE>
   <AUTHOR>Mark Twain</AUTHOR>
   <BINDING>mass market paperback</BINDING>
   <PAGES>298</PAGES>
   <PRICE>$5.49</PRICE>
</BOOK>
Листинг 8.7. Book.xml

В Листинге 8.8 представлена HTML-страница, которая связывает отдельный элемент SPAN с каждым из полей рассматриваемого документа ( TITLE, AUTHOR, BINDING, PAGES, PRICE ).

<!-- Имя файла: Book.htm -->

<HTML>

<HEAD>
   <TITLE>Book Description</TITLE>
</HEAD>

<BODY>

   <XML ID="dsoBook" SRC="Book.xml"></XML>
   
   <H2>Book Description</H2>
 
   <SPAN STYLE="font-style:italic">Title: </SPAN>
   <SPAN STYLE="font-weight:bold" DATASRC="#dsoBook" 
      DATAFLD="TITLE"></SPAN>      
   <BR>
   <SPAN STYLE="font-style:italic">Author: </SPAN>
   <SPAN DATASRC="#dsoBook" DATAFLD="AUTHOR"></SPAN>      
   <BR>
   <SPAN STYLE="font-style:italic">Binding type: </SPAN>
   <SPAN DATASRC="#dsoBook" DATAFLD="BINDING"></SPAN>      
   <BR>
   <SPAN STYLE="font-style:italic">Number of pages: </SPAN>
   <SPAN DATASRC="#dsoBook" DATAFLD="PAGES"></SPAN>      
   <BR>
   <SPAN STYLE="font-style:italic">Price: </SPAN>
   <SPAN DATASRC="#dsoBook" DATAFLD="PRICE"></SPAN>      

</BODY>
</HTML>
Листинг 8.8. Book.htm

На рисунке 8.4 показано как Internet Explorer 5 отобразит эту страницу.


Рис. 8.4.

Перемещение между записями

Если XML-документ содержит более одной записи (как большинство из них), связывание данных по записям становится несколько более сложным, поскольку HTML-элемент может отобразить за раз только одну запись. Отображаемая в данный момент запись называется текущей записью. (Связывание данных по одной записи иногда называют еще связыванием по текущей записи.) Изначально текущей является первая запись в документе.

DSO (объект исходных данных), ассоциированный с XML-документом, предоставляет ряд методов (функций), которыми вы можете воспользоваться при перемещении между записями. Эти методы принадлежат объекту recordset DSO и приведены в таблице 8.2. Заметим, что примеры вызовов, приведенные в последнем столбце, предполагают, что HTML-страница содержит фрагмент данных XML с идентификатором (ID) dsoInventory.

Таблица 8.2.
Метод объекта recordset DSO Переход от текущей записи к Пример вызова
moveFirst первой записи в документе dsoInventory.recordset.moveFirst()
movePrevious предыдущей записи dsoInventory.recordset.movePrevious()
moveNext следующей записи dsoInventory.recordset.moveNext()
moveLast последней записи в документе dsoInventory.recordset.moveLast()
move записи с указанным номером dsoInventory.recordset.move(5) (Переход к пятой записи. Записи нумеруются, начиная с нуля)

Примечание. Составной объект recordset DSO соответствует стандарту технологии доступа к данным, которую Microsoft назвала ActiveX Data Objects (ADO). Вы можете использовать объект общего назначения ADO recordset совместно с множеством различных источников данных, а не только с XML DSO. Более подробную информацию об ADO и объекте ADO recordset вы можете найти на Web-сайте Microsoft, а за документацией по методам, свойствам и событиям объекта recordset обращайтесь по сайт Microsoft Developer Network: http://msdn.microsoft.com/.

Вы можете обращаться к этим методам из написанного вами кода сценария. Однако самый простой способ их вызова – это присвоить имя метода атрибуту ONCLICK элемента BUTTON, как в следующем примере:

<BUTTON ONCLICK="dsoInventory.recordset.moveFirst()">
  First Record
</BUTTON>

Этот элемент отображает кнопку. Когда пользователь щелкает мышью на кнопке, вызывается метод, присвоенный атрибуту ONCLICK, dsoInventory.recordset.moveFirst().

Если текущей является первая запись, вызов метода movePrevious приводит к перемещению в зону начала файла ( BOF ), где нет записей, поэтому сцепленный элемент будет пуст. Аналогично, вызов метода moveNext, если текущей является последняя запись, приводит к перемещению в зону конца файла ( EOF ), поэтому сцепленный элемент также будет пуст.

К счастью, объект recordset поддерживает свойство BOF, которое принимает значение true (истина) , если достигнуто начало файла, а также свойство EOF, которое принимает значение true (истина), если достигнут конец файла. Вы можете использовать эти свойства для определения этих состояний и внесения необходимых корректировок. Например, приведенный ниже код предписывает при щелчке на кнопке в случае, если достигнуто начало файла, быстро отобразить первую запись:

<BUTTON ONCLICK="dsoInventory.recordset.movePrevious();
    if (dsoInventory.recordset.BOF)
    dsoInventory.recordset.moveNext()">
Back
</BUTTON>

Следующий код проверяет достижение конца файла:

<BUTTON ONCLICK="dsoInventory.recordset.moveNext();
    if (dsoInventory.recordset.EOF)
    dsoInventory.recordset.movePrevious()">
Forward
</BUTTON>

Обратим внимание, что вы можете присвоить атрибуту ONCLICK (либо другим атрибутам, относящимся к событиям, например, ONMOUSEOVER ) целый блок кода сценария. В этих примерах код написан на языке Microsoft JScript. Далее в этой лекции вы узнаете, как писать самостоятельные фрагменты кодов сценариев, которые позволяют включать значительно большее число инструкций.

В следующем упражнении вы создадите HTML-страницу, которая отображает XML-документ из Листинга 8.3 по одной записи за один раз. Страница содержит кнопки для перехода к первой, предыдущей, последующей и последней записям.

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

  • Откройте новый, пустой текстовый файл в вашем текстовом редакторе и введите содержимое HTML-страницы, представленное в Листинге 8.9.

    Обратите внимание, что страница содержит фрагмент данных, который связан с документом Inventory Big.xml, содержащим 16 записей. (См. Листинг 8.3.)

  • Воспользуйтесь командой Save (Сохранить) вашего текстового редактора, чтобы сохранить страницу на вашем жестком диске, присвоив ей имя файла Inventory Single.htm.
    <!-- Имя файла: Inventory Single.htm -->
    
    <HTML>
    
    <HEAD>
       <TITLE>Book Inventory</TITLE>
    </HEAD>
    
    <BODY>
    
       <XML ID="dsoInventory" SRC="Inventory Big.xml"></XML>
       
       <H2>Book Description</H2>
     
       <SPAN STYLE="font-style:italic">Title: </SPAN>
       <SPAN DATASRC="#dsoInventory" DATAFLD="TITLE" 
          STYLE="font-weight:bold"></SPAN>      
       <BR>
       <SPAN STYLE="font-style:italic">Author: </SPAN>
       <SPAN DATASRC="#dsoInventory" DATAFLD="AUTHOR"></SPAN>      
       <BR>
       <SPAN STYLE="font-style:italic">Binding type: </SPAN>
       <SPAN DATASRC="#dsoInventory" DATAFLD="BINDING"></SPAN>      
       <BR>
       <SPAN STYLE="font-style:italic">Number of pages: </SPAN>
       <SPAN DATASRC="#dsoInventory" DATAFLD="PAGES"></SPAN>      
       <BR>
       <SPAN STYLE="font-style:italic">Price: </SPAN>
       <SPAN DATASRC="#dsoInventory" DATAFLD="PRICE"></SPAN>      
    
       <HR>
    
       <BUTTON ONCLICK="dsoInventory.recordset.moveFirst()">
          |&lt; First
       </BUTTON>
       <BUTTON ONCLICK="dsoInventory.recordset.movePrevious();
                        if (dsoInventory.recordset.BOF)
                           dsoInventory.recordset.moveNext()">
          &lt; Back
       </BUTTON>
       <BUTTON ONCLICK="dsoInventory.recordset.moveNext();
                        if (dsoInventory.recordset.EOF)
                           dsoInventory.recordset.movePrevious()">
          Forward &gt;
       </BUTTON>
       <BUTTON ONCLICK="dsoInventory.recordset.moveLast()">
          Last &gt;|
       </BUTTON>
    
    </BODY>
    
    </HTML>
    Листинг 8.9. Inventory Single.htm
  • В Windows Explorer (Проводник) или в окне папки дважды щелкните на имени файла Inventory Single.htm, который вы сохранили на предыдущем шаге.

    Internet Explorer 5 откроет страницу и отобразит ее, как показано на рисунке 8.5.


Рис. 8.5.

Заметим, что изначально, пока пользователь еще не щелкнул мышью на какой-либо кнопке, Internet Explorer 5 отображает только первую запись в документе.

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

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

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

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

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

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

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

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

Спасибо!

Максим Самсоненко
Максим Самсоненко
Россия
Алексей Шибаев
Алексей Шибаев
Россия, г. Новошахтинск