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

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

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

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

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

<INPUT TYPE="ТEXT" DATASRC="#dsoInventory" DATAFLD="TITLE">

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

Таблица 5.19

Методы объекта recordset

Методы объекта recordset DSO

Эффект

Пример обращения

addNew

Добавляет новую запись к накопленному набору записей

dsoInventory.recordset.addNew()

delete

Удаляет текущую запись из накопленного набора записей

dsoInventory.recordset.delete()

cancelUpdate

Возвращает любые изменения, сделанные для полей текущей записи, либо удаляет вновь введённую запись

dsoInventory.recordset.cancelUpdate()

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

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

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

Если XML-документ, который будет отображён с помощью связывания данных, содержит ошибки валидности, в сцепленных элементах не будут отображены никакие данные, но при этом не появится и сообщение об ошибке. Чтобы увидеть сообщение об ошибке в связанном XML-документе, следует протестировать этот документ с применением сценария проверки на корректность и валидность (см. раздел “Проверка валидности XML-документа” в главе 7).

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

<?xml version="1.0"?>

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

<!DOCTYPE INVENTORY

[

<!ELEMENT INVENTORY (PLACE*)>

<!ELEMENT PLACE (COUNTRY, BOOK*)>

<!ELEMENT COUNTRY (#PCDATA)>

<!ELEMENT BOOK (TITLE, AUTHOR, BINDING, PAGES, PRICE)>

<!ELEMENTTITLE (#PCDATA)>

<!ELEMENT AUTHOR (#PCDATA)>

<!ELEMENT BINDING (#PCDATA)>

<!ELEMENT PAGES (*PCDATA)>

<!ELEMENT PRICE (#PCDATA)>

]

>

<INVENTORY>

<PLACE>

<COUNTRY>Россия</COUNTRY>

<BOOK>

<TITLE>Война и мир</TITLE>

<AUTHOR>Лев Толстой</AUTHOR>

<BINDING>Жёсткая обложка</BINDING>

<PAGES>510</PAGES>

<PRICE>12 000 рублей</PRICE>

</BOOK>

<BOOK>

<TITLE>Преступление и наказание</TITLE>

<AUTHOR>Фёдор Достоевский</AUTHOR>

<BINDING>Мягкая обложка</BINDING>

<PAGES>590</PAGES>

<PRICE>14 000 рублей</PRICE>

</BOOK>

</PLACE>

<PLACE>

<COUNTRY>Франция</COUNTRY>

<BOOK>

<TITLE>Королева Марго</TITLE>

<AUTHOR>Александр Дюма</AUTHOR>

<BINDING>Мягкая обложка</BINDING>

<PAGES>410</PAGES>

<PRICE>10 000 рублей</PRICE>

</BOOK>

</PLACE>

<PLACE>

<COUNTRY>Англия</COUNTRY>

<BOOK>

<TITLE>Затерянный мир</TITLE>

<AUTHOR>Артур Конан Дойль</AUTHOR>

<BINDING>Жёсткая обложка</BINDING>

<PAGES>350</PAGES>

<PRICE>9 000 рублей</PRICE>

</BOOK>

</PLACE>

</INVENTORY>

Листинг 1.23

Для отображения XML-документа, приведённого в листинге 1.23, можно использовать HTML-документ из листинга 1.18