Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс лекций СБД.doc
Скачиваний:
24
Добавлен:
13.11.2019
Размер:
1.94 Mб
Скачать
      1. Создание хмl-документов на основе информации из базы данных

Во многих СУБД имеются средства для генерации XML-документов на основе содержимого базы данных.

Средства работы с XML в СУБД быстро эволюционируют. В случае SQL Server в версию 7.0 было добавлено выражение FOR XML ТО SQL SELECT. В 2002 году возможности SQL Server были расширены за счет SQLXML – библиотеки классов, которую можно загрузить с сайта http://msdn.microsoft.com. Каждая новая версия СУБД предлагает существенные новшества в технологиях XML.

Рассмотрим следующую команду SQL (в таблице ARTIST содержатся атрибуты (Name, Nationality, BirthDate, DeceasedDate):

SELECT * FROM Artist FOR XML RAW;

Выражение FOR XML RAW предписывает SQL Server создать XML-документ, в котором непустые столбцы результата запроса будут играть роль атрибутов. В листинге 4 приведен пример результата выполнения такого выражения. Как и ожидалось, каждый столбец, значение которого задано, становится атрибутом элемента под названием ARTIST.

Листинг 4. Пример использования выражения FOR XML RAW

<MyData> <ARTIST ArtistID="3" Name="Miro"

Nationality="Spanish" BirthDate="1893" DeceasedDate="1983"/>

<ARTIST ArtistID="4" Name="Kandinsky"

Nationality="Russian" BirthDate="1866" DeceasedDate="1944"/>

<ARTIST ArtistID="5" Name="Frings"

Nationality="US" BirthDate="1700" DeceasedDate="1800"/>

<ARTIST ArtistlD="6" Name="Klee"

Nationality="German" BirthDate="1879" DeceasedDate="1940"/> "

<ARTIST ArtistID-"8" Name-"Moos"

Nationality-"US"/>

<ARTIST ArtistID-"14" Name="Tobey"

Nationality="US"/>

<ARTIST ArtistID-"15" Name-"Matisse"

Nationality="French"/>

<ARTIST ArtistID-"16" Name-"Chagall"

Nationality-"French" BirthDate="1887" DeceasedDate="1985"/>

</MyData>

Можно заставить SQL Server помещать значения столбцов не в атрибуты, а в элементы XМL-документа, как это сделано в листинге 5. Подобный документ можно создать при помощи следующей команды:

SELECT * FROM Artist FOR XML AUTO, ELEMENTS;

Листинг 5. Пример использования выражения FOR XML AUTO, ELEMENTS

<MyData>

<ARTIST>

<ArtistID>3</ArtistID> <Name>Miro</Name>

<Nationality>Spanish </Nationality>

<BirthDate>l870/BirthDate> <DeceasedDate>l950</DeceasedDate>

</ARTIST>

<ARTIST>

<ArtistID>4</ArtistID>

<Name>Kandinsky</Name>

<Nationality> Russian</Nationality>

<BirthDate>l854</BirthDate>

<DeceasedDate>1900</DeceasedDate>

</ARTIST> …

<ARTIST>

<ArtistID>15</ArtistID>

<Name>Matisse</Name>

<Nationality>French</Nationality>

</ARTIST>

<ARTIST>

<ArtistID>16</ArtistID>

<Name>Chagall</Name>

<Nationality>French</ARTIST>

</MyData>

Используя выражение FOR XML EXPLICIT, разработчик может указать SQL Server, какие столбцы результата должны играть роль элементов, а какие – атрибутов. Можно, например, сделать так, чтобы значения всех столбцов, кроме суррогатного ключа ArtistID, помещались в элементы XML-документа, а значения суррогатного ключа – в атрибуты. Значения суррогатного ключа не имеют смысла для пользователей, поэтому они больше похожи на метаданные, чем на данные.

Возможности команды SELECT...FOR XML не ограничиваются однотабличными запросами. Рассмотрим следующий запрос, соединяющий таблицы CUSTOMER и ARTIST:

SELECT CUSTOMER.Name, ARTIST.Name FROM CUSTOMER, Покупки, ARTIST

WHERE CUSTOMER.CustomerID = Покупки.CustomerID

AND Покупки.ArtistID = ARTIST.ArtistID

ORDER BY CUSTOMER.Name

FOR XML AUTO, ELEMENTS;

Результатом запроса будет XML-документ, приведенный в листинге 6.

Листинг 6. Результат запроса FOR XML AUTO, ELEMENTS для таблиц CUSTOMER и ARTIST

<MyData xmlns:xsi= ".http://www.w3.org/2000/10/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\Лекции\XML\Покупатель-Художник.xsd">

<CUST0MER>

<Name>Chris Wilkens</Name>

<ARTIST>

<Name>Frings </Name>

</ARTIST>

<ARTIST>

<Tobey</Name>

</ARTIST>

</CUST0MER>

<CUST0MER>

<Name>Michael Bench</Name>

<ARTIST>

<Name>Moos</Name>

</ARTIST>

<ARTIST>

<Name>Frings </Name>

</ARTIST>

<ARTIST>

<Name>Tobey</Name>

</ARTIST>

</CUST0MER>

<CUST0MER>

<Name>Selma Warning</Nafne>

<ARTIST>

<Name>Miro</Name>

</ARTIST>

<ARTIST>

<Name>Chagall</Name>

</ARTIST>

</CUST0MER>

</MyData>