Опубликован: 24.01.2007 | Доступ: свободный | Студентов: 9681 / 1718 | Оценка: 4.28 / 4.09 | Длительность: 20:51:00
Лекция 8:

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

Обновление накопленных данных XML

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

Вы можете разрешить пользователю модифицировать определенное XML-поле, сцепив его с HTML-элементом, допускающим обновление, например, элемент INPUT типа TEXT. В крайнем правом столбце Таблицы 8.3 содержатся сведения, допускает ли HTML-элемент обновление пользователем XML-поля, сцепленного с этим элементом.

Например, если вместо сцепления поля TITLE с элементом SPAN вы свяжете его с элементом INPUT типа TEXT, как показано ниже, пользователь сможет редактировать, а не только просматривать, содержимое TITLE:

<INPUT TYPE="TEXT" DATASRC="#dsoInventory" DATAFLD="TITLE">

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

Таблица 8.4.
Метод объекта recordset DSO Эффект Пример обращения
addNew Добавляет новую запись к накопленному набору записей dsoInventory.recordset.addNew()
delete Удаляет текущую запись из накопленного набора записей dsoInventory.recordset.delete()
cancelUpdate Возвращает любые изменения, сделанные для полей текущей записи, либо удаляет вновь введенную запись dsoInventory.recordset.cancelUpdate()

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

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

Включение DTD особенно полезно для документа, который имеет более сложную иерархическую структуру записей, чем та, которую вы можете отобразить с помощью вложенных таблиц. Примером является документ из Листинга 8.5. В следующем упражнении вы добавите DTD в этот документ, превратив его в валидный и обеспечив тем самым необходимую для связывания данных структуру записей.

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

Внимание! Когда вы создаете объявление элемента для записи (такой, как CATEGORY или BOOK в Листинге 8.12), вы должны включить модель содержимого, которая исчерпывающе описывает все поля записи и вложенные записи. При этом нельзя использовать спецификацию содержимого ANY, иначе это приведет к нарушению связей между данными.

Создайте валидный XML-документ для связывания данных

  1. В вашем текстовом редакторе откройте документ Inventory Hierarchy.xml, который вы создали ранее в этой лекции. (См. Листинг 8.5).
  2. Непосредственно над элементом Документ ( INVENTORY ) введите следующее объявление типа:
    <!DOCTYPE INVENTORY
      [
      <!ELEMENT INVENTORY (CATEGORY*)>
      <!ELEMENT CATEGORY (CATNAME, BOOK*)>
      <!ELEMENT CATNAME (#PCDATA)>
      <!ELEMENT BOOK (TITLE, AUTHOR, BINDING, PAGES, PRICE)>
      <!ELEMENT TITLE (#PCDATA)>
      <!ELEMENT AUTHOR (#PCDATA)>
      <!ELEMENT BINDING (#PCDATA)>
      <!ELEMENT PAGES (#PCDATA)>
      <!ELEMENT PRICE (#PCDATA)>
      ]
    >

    Эти объявления элементов можно объяснить в терминах набора записей и связывания данных следующим образом:

    • <!ELEMENT INVENTORY (CATEGORY*)> – документ содержит нуль или несколько записей CATEGORY ;
    • <!ELEMENT CATEGORY (CATNAME, BOOK*)> – каждая запись CATEGORY содержит одно поле CATNAME, после которого идет нуль или несколько вложенных записей BOOK ;
    • <!ELEMENT BOOK (TITLE, AUTHOR, BINDING, PAGES, PRICE)> – каждая вложенная запись BOOK содержит по одному из следующих полей в порядке перечисления: TITLE, AUTHOR, BINDING, PAGES и PRICE ;
    • <!ELEMENT TITLE (#PCDATA)> и все остальные объявления – каждое из полей в записи BOOK содержит только символьные данные.
  3. Чтобы отразить новое имя файла, которое вы присвоите, измените комментарий в начале документа с
    <!-- Имя файла: Inventory Hierarchy.xml -->

    на

    <!-- Имя файла: Inventory Hierarchy Valid.xml -->
  4. Воспользуйтесь командой Save As (Сохранить как) вашего текстового редактора, чтобы сохранить копию модифицированного документа, задав в качестве имени файла Inventory Hierarchy Valid.xml.

    В Листинге 8.12 представлен полный XML-документ.

    <?xml version="1.0" encoding="windows-1251" ?>
    
    <!-- Имя файла: Inventory Hierarchy Valid.xml -->
    
    <!DOCTYPE INVENTORY
       [
       <!ELEMENT INVENTORY (CATEGORY*)>
       <!ELEMENT CATEGORY (CATNAME, BOOK*)> 
       <!ELEMENT CATNAME (#PCDATA)>
       <!ELEMENT BOOK (TITLE, AUTHOR, BINDING, PAGES, PRICE)>
       <!ELEMENT TITLE (#PCDATA)>
       <!ELEMENT AUTHOR (#PCDATA)>
       <!ELEMENT BINDING (#PCDATA)>
       <!ELEMENT PAGES (#PCDATA)>
       <!ELEMENT PRICE (#PCDATA)>
       ]
    >
    
    <INVENTORY>
       <CATEGORY>
          <CATNAME>Middle Ages</CATNAME>
          <BOOK>
             <TITLE>The Canterbury Tales</TITLE>
             <AUTHOR>Geoffrey Chaucer</AUTHOR>
             <BINDING>hardcover</BINDING>
             <PAGES>692</PAGES>
             <PRICE>$18.95</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Piers Plowman</TITLE>
             <AUTHOR>William Langland</AUTHOR>
             <BINDING>trade paperback</BINDING>
             <PAGES>385</PAGES>
             <PRICE>$10.95</PRICE>
          </BOOK>
       </CATEGORY>
       <CATEGORY>
          <CATNAME>Renaissance</CATNAME>
          <BOOK>
             <TITLE>The Blazing World</TITLE>
             <AUTHOR>Margaret Cavendish</AUTHOR>
             <BINDING>trade paperback</BINDING>
             <PAGES>225</PAGES>
             <PRICE>$8.79</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Oroonoko</TITLE>
             <AUTHOR>Aphra Behn</AUTHOR>
             <BINDING>mass market paperback</BINDING>
             <PAGES>295</PAGES>
             <PRICE>$4.95</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Doctor Faustus</TITLE>
             <AUTHOR>Christopher Marlowe</AUTHOR>
             <BINDING>hardcover</BINDING>
             <PAGES>472</PAGES>
             <PRICE>$15.95</PRICE>
          </BOOK>
       </CATEGORY>
       <CATEGORY>
          <CATNAME>18th Century</CATNAME>
          <BOOK>
             <TITLE>Gulliver's Travels</TITLE>
             <AUTHOR>Jonathan Swift</AUTHOR>
             <BINDING>hardcover</BINDING>
             <PAGES>324</PAGES>
             <PRICE>$11.89</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>The History of Tom Jones: A Foundling</TITLE>
             <AUTHOR>Henry Fielding</AUTHOR>
             <BINDING>hardcover</BINDING>
             <PAGES>438</PAGES>
             <PRICE>$16.95</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Love in Excess</TITLE>
             <AUTHOR>Eliza Haywood</AUTHOR>
             <BINDING>trade paperback</BINDING>
             <PAGES>429</PAGES>
             <PRICE>$12.95</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Tristram Shandy</TITLE>
             <AUTHOR>Laurence Sterne</AUTHOR>
             <BINDING>hardcover</BINDING>
             <PAGES>322</PAGES>
             <PRICE>$9.49</PRICE>
          </BOOK>
       </CATEGORY>
       <CATEGORY>
          <CATNAME>19th Century</CATNAME>
          <BOOK>
             <TITLE>Dracula</TITLE>
             <AUTHOR>Bram Stoker</AUTHOR>
             <BINDING>hardcover</BINDING>
             <PAGES>395</PAGES>
             <PRICE>$17.95</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Great Expectations</TITLE>
             <AUTHOR>Charles Dickens</AUTHOR>
             <BINDING>mass market paperback</BINDING>
             <PAGES>639</PAGES>
             <PRICE>$6.95</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Percival Keene</TITLE>
             <AUTHOR>Frederick Marryat</AUTHOR>
             <BINDING>trade paperback</BINDING>
             <PAGES>425</PAGES>
             <PRICE>$12.89</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Treasure Island</TITLE>
             <AUTHOR>Robert Louis Stevenson</AUTHOR>
             <BINDING>trade paperback</BINDING>
             <PAGES>283</PAGES>
             <PRICE>$11.85</PRICE>
          </BOOK>
          <BOOK>
             <TITLE>Wuthering Heights</TITLE>
             <AUTHOR>Emily Bronte</AUTHOR>
             <BINDING>hardcover</BINDING>
             <PAGES>424</PAGES>
             <PRICE>$12.95</PRICE>
          </BOOK>
       </CATEGORY>
    </INVENTORY>
    Листинг 8.12. Inventory Hierarchy Valid.xml
  5. В вашем текстовом редакторе откройте страницу Inventory Hierarchy.htm, созданную вами ранее в этой лекции. (Этот документ представлен в Листинге 8.6).
  6. Измените атрибут SRC фрагмента данных на странице, чтобы он был связан с новым XML-документом, который вы только что создали, а именно, замените
    <XML ID="dsoInventory" SRC="Inventory Hierarchy.xml"></XML>

    на

    <XML ID="dsoInventory" SRC="Inventory Hierarchy Valid.xml"></XML>
  7. Чтобы отразить новое имя файла, которое вы присвоите, измените комментарий в начале страницы с
    <!-- Имя файла: Inventory Hierarchy.htm -->

    на

    <!-- Имя файла: Inventory Hierarchy Valid.htm -->
  8. Воспользуйтесь командой Save As (Сохранить как) вашего текстового редактора, чтобы сохранить копию модифицированной страницы, задав в качестве имени файла Inventory Hierarchy Valid.htm.

    Полная HTML-страница представлена в Листинге 8.13.

    <!-- Имя файла: Inventory Hierarchy Valid.htm -->
    
    <HTML>
    
    <HEAD>
       <TITLE>Inventory of Classic English Literature</TITLE>
    </HEAD>
    
    <BODY>
    
       <XML ID="dsoInventory" SRC="Inventory Hierarchy Valid.xml">
       </XML>
       
       <TABLE DATASRC="#dsoInventory" BORDER="1">
          <THEAD>
             <TH>Classic English Literature</TH>
          </THEAD>
          <TR>
             <TD><SPAN DATAFLD="CATNAME"></SPAN></TD>
          </TR>
          <TR>
             <TD>
                <TABLE DATASRC="#dsoInventory" DATAFLD="BOOK" 
                   BORDER=0 CELLSPACING=10>
                   <THEAD>
                      <TH>Title</TH>
                      <TH>Author</TH>
                      <TH>Binding</TH>
                      <TH>Pages</TH>
                      <TH>Price</TH>
                   </THEAD>     
                   <TR ALIGN="CENTER">
                      <TD><SPAN DATAFLD="TITLE" 
                         STYLE="font-style:italic"></SPAN></TD>
                      <TD><SPAN DATAFLD="AUTHOR"></SPAN></TD>
                      <TD><SPAN DATAFLD="BINDING"></SPAN></TD>
                      <TD><SPAN DATAFLD="PAGES"></SPAN></TD>
                      <TD><SPAN DATAFLD="PRICE"></SPAN></TD>
                   </TR>
                </TABLE>
             </TD>
          </TR>
       </TABLE>      
    
    </BODY>
    
    </HTML>
    Листинг 8.13. Inventory Hierarchy Valid.htm
  9. Откройте страницу в Internet Explorer 5.

    Она должна выглядеть, как показано на рисунке 8.7.


    Рис. 8.7.
  10. Если данные не отображаются, то в документе имеется ошибка корректности или валидности. Чтобы обнаружить ошибку, воспользуйтесь сценарием проверки на валидность (см. раздел "Проверка валидности XML-документа" в "Отображение XML-документов с использованием сценариев объектной модели документа" ).
Максим Попов
Максим Попов

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

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

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

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

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

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

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

Спасибо!