Опубликован: 05.08.2007 | Доступ: свободный | Студентов: 2200 / 83 | Оценка: 4.47 / 4.09 | Длительность: 20:11:00
ISBN: 978-5-9556-0097-0
Лекция 11:

Типизированный объект DataSet. Чтение и запись XML-документов

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

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

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

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

Таблица 11.5. XML-документы, соответствующие таблицам "Сезоны", "Путевки" и "Оплата"
Сезоны, файл 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).

Таблица 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).