Технология Microsoft ADO.NET

       

Связи в XSD-схемах


Приступим к рассмотрению связей между элементами и документами, которые могут хранить XSD-схемы. Самое сложное в создании связей - определение логической структуры документа или группы документов, впрочем, мы уже сталкивались с этим при проектировании базы данных. В этой лекции при создании документа XMLTour.xml мы использовали содержимое таблицы "Туры" базы данных BDTur_firm.mdb. В первой лекции мы определяли связи между таблицами этой базы данных, так, одна ветвь имела следующий вид:

"Туры" 1 -

"Сезоны" 1 -
"Путевки" 1 -
"Оплата"

Восстановим это же отношение в XML-документах. Первое, с чего мы начнем, - это создание отдельных документов (таблица 11.5).

Таблица 11.5. XML-документы, соответствующие таблицам "Сезоны", "Путевки" и "Оплата"

Сезоны, файл XMLSeason.xmlПутевки, файл XMLPass.xmlОплата, XMLPayment.xml

<?xml version="1.0" encoding="utf-8" ?> <!-- Название файла XMLSeason.xml --> <TABLE> <SEASON> <IDSEASON>1</IDSEASON> <IDTOUR>1</IDTOUR> <DATE_OF_COMMENCEMENT>01.05.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>01.10.2007</DATA_OF_TERMINATION> <SEASON_OFF>0</SEASON_OFF> <PLACE>25</PLACE> </SEASON> <SEASON> <IDSEASON>2</IDSEASON> <IDTOUR>2</IDTOUR> <DATE_OF_COMMENCEMENT>01.06.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>31.08.2007</DATA_OF_TERMINATION> <SEASON_OFF>1</SEASON_OFF> <PLACE>30</PLACE> </SEASON> <SEASON> <IDSEASON>3</IDSEASON> <IDTOUR>3</IDTOUR> <DATE_OF_COMMENCEMENT>01.04.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>01.10.2007</DATA_OF_TERMINATION> <SEASON_OFF>0</SEASON_OFF> <PLACE>15</PLACE> </SEASON> <SEASON> <IDSEASON>4</IDSEASON> <IDTOUR>4</IDTOUR> <DATE_OF_COMMENCEMENT>01.03.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>01.09.2007</DATA_OF_TERMINATION> <SEASON_OFF>0</SEASON_OFF> <PLACE>12</PLACE> </SEASON> <SEASON> <IDSEASON>5</IDSEASON> <IDTOUR>5</IDTOUR> <DATE_OF_COMMENCEMENT>01.03.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>01.10.2007</DATA_OF_TERMINATION> <SEASON_OFF>0</SEASON_OFF> <PLACE>12</PLACE> </SEASON> </TABLE>

<?xml version="1.0" encoding="utf-8" ?> <!-- Название файла XMLPass.xml --> <TABLE> <PASS> <IDPASS>1</IDPASS> <IDTOURIST>1</IDTOURIST> <IDSEASON>1</IDSEASON> </PASS> <PASS> <IDPASS>2</IDPASS> <IDTOURIST>2</IDTOURIST> <IDSEASON>2</IDSEASON> </PASS> <PASS> <IDPASS>3</IDPASS> <IDTOURIST>3</IDTOURIST> <IDSEASON>3</IDSEASON> </PASS> <PASS> <IDPASS>4</IDPASS> <IDTOURIST>4</IDTOURIST> <IDSEASON>4</IDSEASON> </PASS> <PASS> <IDPASS>5</IDPASS> <IDTOURIST>5</IDTOURIST> <IDSEASON>5</IDSEASON> </PASS> </TABLE>

<?xml version="1.0" encoding="utf-8" ?> <!-- Название файла XMLPayment.xml --> <TABLE> <PAYMENT> <IDPAYMENT>1</IDPAYMENT> <IDPASS>1</IDPASS> <DATE_OF_PAYMENT>13.04.2007</DATE_OF_PAYMENT> <AMOUNT>25 000,00р.</AMOUNT> </PAYMENT> <PAYMENT> <IDPAYMENT>2</IDPAYMENT> <IDPASS>2</IDPASS> <DATE_OF_PAYMENT>15.05.2006</DATE_OF_PAYMENT> <AMOUNT>32 000,00р.</AMOUNT> </PAYMENT> <PAYMENT> <IDPAYMENT>3</IDPAYMENT> <IDPASS>3</IDPASS> <DATE_OF_PAYMENT>05.03.2007</DATE_OF_PAYMENT> <AMOUNT>30 000,00р.</AMOUNT> </PAYMENT> <PAYMENT> <IDPAYMENT>4</IDPAYMENT> <IDPASS>4</IDPASS> <DATE_OF_PAYMENT>02.02.2007</DATE_OF_PAYMENT> <AMOUNT>26 000,00р.</AMOUNT> </PAYMENT> <PAYMENT> <IDPAYMENT>5</IDPAYMENT> <IDPASS>5</IDPASS> <DATE_OF_PAYMENT>25.02.2007</DATE_OF_PAYMENT> <AMOUNT>27 000,00р.</AMOUNT> </PAYMENT> </TABLE>

<
Ничего сложного в создании этих документов нет - их структура в точности такая же, как и структура документа XMLTour.xml. Названия полей были переведены по смыслу на английский язык и стали названиями тегов. Теперь нам нужно объединить все четыре документа в один документ XMLTourFull.xml следующим образом:

<?xml version="1.0" encoding="utf-8"?> <!-- Название файла XMLTourFull.xml --> <TABLE> <TOUR> ... Дочерние элементы тега TOUR документа XMLTour.xml ... <SEASON> ... Дочерние элементы тега SEASON ... <PASS> ... Дочерние элементы тега PASS ...

<PAYMENT> ... Дочерние элементы тега PAYMENT ... </PAYMENT> </PASS> </SEASON> </TOUR> ... Следующая группа дочерних элементов текущего тега TOUR ...

</TABLE>

Готовый документ будет иметь следующий вид:

<?xml version="1.0" encoding="utf-8"?> <!-- Название файла XMLTourFull.xml --> <TABLE> <TOUR> <IDTOUR>1</IDTOUR> <NAME>Кипр</NAME> <PRICE>25 000,00р. </PRICE> <INFORMATION>В стоимость двух взрослых путевок входит цена одной детской (до 7 лет)</INFORMATION> <SEASON> <IDSEASON>1</IDSEASON> <IDTOUR>1</IDTOUR> <DATE_OF_COMMENCEMENT>01.05.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>01.10.2007</DATA_OF_TERMINATION> <SEASON_OFF>0</SEASON_OFF> <PLACE>25</PLACE> <PASS> <IDPASS>1</IDPASS> <IDTOURIST>1</IDTOURIST> <IDSEASON>1</IDSEASON> <PAYMENT> <IDPAYMENT>1</IDPAYMENT> <IDPASS>1</IDPASS> <DATE_OF_PAYMENT>13.04.2007</DATE_OF_PAYMENT> <AMOUNT>25 000,00р.</AMOUNT> </PAYMENT> </PASS> </SEASON> </TOUR> <TOUR> <IDTOUR>2</IDTOUR> <NAME>Греция</NAME> <PRICE>32 000,00р. </PRICE> <INFORMATION>В августе и сентябре действуют специальные скидки</INFORMATION> <SEASON> <IDSEASON>2</IDSEASON> <IDTOUR>2</IDTOUR> <DATE_OF_COMMENCEMENT>01.06.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>31.08.2007</DATA_OF_TERMINATION> <SEASON_OFF>1</SEASON_OFF> <PLACE>30</PLACE> <PASS> <IDPASS>2</IDPASS> <IDTOURIST>2</IDTOURIST> <IDSEASON>2</IDSEASON> <PAYMENT> <IDPAYMENT>2</IDPAYMENT> <IDPASS>2</IDPASS> <DATE_OF_PAYMENT>15.05.2006</DATE_OF_PAYMENT> <AMOUNT>32 000,00р.</AMOUNT> </PAYMENT> </PASS> </SEASON> </TOUR> <TOUR> <IDTOUR>3</IDTOUR> <NAME>Таиланд</NAME> <PRICE>30 000,00р.</PRICE> <INFORMATION>Не включая стоимость авиабилета</INFORMATION> <SEASON> <IDSEASON>3</IDSEASON> <IDTOUR>3</IDTOUR> <DATE_OF_COMMENCEMENT>01.04.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>01.10.2007</DATA_OF_TERMINATION> <SEASON_OFF>0</SEASON_OFF> <PLACE>15</PLACE> <PASS> <IDPASS>3</IDPASS> <IDTOURIST>3</IDTOURIST> <IDSEASON>3</IDSEASON> <PAYMENT> <IDPAYMENT>3</IDPAYMENT> <IDPASS>3</IDPASS> <DATE_OF_PAYMENT>05.03.2007</DATE_OF_PAYMENT> <AMOUNT>30 000,00р.</AMOUNT> </PAYMENT> </PASS> </SEASON> </TOUR> <TOUR> <IDTOUR>4</IDTOUR> <NAME>Италия</NAME> <PRICE>26 000,00р.</PRICE> <INFORMATION>Завтрак в отеле включен в стоимость путевки</INFORMATION> <SEASON> <IDSEASON>4</IDSEASON> <IDTOUR>4</IDTOUR> <DATE_OF_COMMENCEMENT>01.03.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>01.09.2007</DATA_OF_TERMINATION> <SEASON_OFF>0</SEASON_OFF> <PLACE>12</PLACE> <PASS> <IDPASS>4</IDPASS> <IDTOURIST>4</IDTOURIST> <IDSEASON>4</IDSEASON> <PAYMENT> <IDPAYMENT>4</IDPAYMENT> <IDPASS>4</IDPASS> <DATE_OF_PAYMENT>02.02.2007</DATE_OF_PAYMENT> <AMOUNT>26 000,00р.</AMOUNT> </PAYMENT> </PASS> </SEASON> </TOUR> <TOUR> <IDTOUR>5</IDTOUR> <NAME>Франция</NAME> <PRICE>27 000,00р.</PRICE> <INFORMATION>Дополнительные экскурсии не входят в стоимость путевки</INFORMATION> <SEASON> <IDSEASON>5</IDSEASON> <IDTOUR>5</IDTOUR> <DATE_OF_COMMENCEMENT>01.03.2007</DATE_OF_COMMENCEMENT> <DATA_OF_TERMINATION>01.10.2007</DATA_OF_TERMINATION> <SEASON_OFF>0</SEASON_OFF> <PLACE>12</PLACE> <PASS> <IDPASS>5</IDPASS> <IDTOURIST>5</IDTOURIST> <IDSEASON>5</IDSEASON> <PAYMENT> <IDPAYMENT>5</IDPAYMENT> <IDPASS>5</IDPASS> <DATE_OF_PAYMENT>25.02.2007</DATE_OF_PAYMENT> <AMOUNT>27 000,00р.</AMOUNT> </PAYMENT> </PASS> </SEASON> </TOUR> </TABLE>



Переключаемся на вкладку
(Data) и видим, что представление XML-документа сильно изменилось (сравните с рис. 10.4). Теперь таблицы связаны (рис. 11.6).


увеличить изображение
Рис. 11.6.  А - переход к записи таблицы "Сезоны", Б - переход к записи таблицы "Путевки", В - переход к записи таблицы "Оплата", Г - результирующий вид

Создадим схему документа XMLTourFull.xml, выбирая в главном меню пункт "XML\Create Schema". Графическое представление схемы отражает связь между соответствующими таблицами XML-документа (таблица 11.6).

Таблица 11.6. Схема XMLTourFull.xsdВид в режиме
(DataSet) Вид в режиме
(XML)


<?xml version="1.0" ?> <xs:schema id="TABLE" targetNamespace="http://tempuri.org/XMLTourFull.xsd" xmlns:mstns="http://tempuri.org/XMLTourFull.xsd" xmlns="http://tempuri.org/XMLTourFull.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified"> <xs:element name="TABLE" msdata:IsDataSet="true" msdata:Locale="ru-RU" msdata:EnforceConstraints="False"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element name="TOUR"> <xs:complexType> <xs:sequence> <xs:element name="IDTOUR" type="xs:string" minOccurs="0" /> <xs:element name="NAME" type="xs:string" minOccurs="0" /> <xs:element name="PRICE" type="xs:string" minOccurs="0" /> <xs:element name="INFORMATION" type="xs:string" minOccurs="0" /> <xs:element name="SEASON" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="IDSEASON" type="xs:string" minOccurs="0" /> <xs:element name="IDTOUR" type="xs:string" minOccurs="0" /> <xs:element name="DATE_OF_COMMENCEMENT" type="xs:string" minOccurs="0" /> <xs:element name="DATA_OF_TERMINATION" type="xs:string" minOccurs="0" /> <xs:element name="SEASON_OFF" type="xs:string" minOccurs="0" /> <xs:element name="PLACE" type="xs:string" minOccurs="0" /> <xs:element name="PASS" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="IDPASS" type="xs:string" minOccurs="0" /> <xs:element name="IDTOURIST" type="xs:string" minOccurs="0" /> <xs:element name="IDSEASON" type="xs:string" minOccurs="0" /> <xs:element name="PAYMENT" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="IDPAYMENT" type="xs:string" minOccurs="0" /> <xs:element name="IDPASS" type="xs:string" minOccurs="0" /> <xs:element name="DATE_OF_PAYMENT" type="xs:string" minOccurs="0" /> <xs:element name="AMOUNT" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema>
В программном обеспечении к курсу вы найдете файлы XMLTourFull.xml и XMLTourFull.xsd в папке XSD (Code\Glava5\ XSD).


Содержание раздела