Типизированный объект DataSet. Чтение и запись XML-документов
Связи в XSD-схемах
Приступим к рассмотрению связей между элементами и документами, которые могут хранить XSD-схемы. Самое сложное в создании связей - определение логической структуры документа или группы документов, впрочем, мы уже сталкивались с этим при проектировании базы данных. В этой лекции при создании документа XMLTour.xml мы использовали содержимое таблицы "Туры" базы данных BDTur_firm.mdb. В "Элементы работы с базами данных" мы определяли связи между таблицами этой базы данных, так, одна ветвь имела следующий вид:
"Туры" 1 -
"Сезоны" 1 -
"Путевки" 1 -
"Оплата"
Восстановим это же отношение в XML-документах. Первое, с чего мы начнем, - это создание отдельных документов (таблица 11.5).
| Сезоны, файл XMLSeason.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> |
| Путевки, файл XMLPass.xml |
<?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> |
| Оплата, XMLPayment.xml |
<?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).
Вид в режиме
|
|---|
![]() |
(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).


(XML)