Типизированный объект DataSet. Чтение и запись XML-документов
Типизированный объект DataSet. Чтение и запись XML-документов
XML-схемы данных (XSD)
Схемы данных1Точный перевод XML Schema Document - <схема документа XML>, однако мы будем в дальнейшем использовать термин "схема данных XML". XSD (XML Schema Document, XSD) представляют собой альтернативный способ правил построения XML-документов. По сравнению с DTD, схемы обладают более мощными средствами для определения сложных структур данных, обеспечивают более понятный способ описания грамматики языка, способны легко модернизироваться и расширяться. Схема XSD может содержать следующую информацию:
- представление связей между элементами данных, аналогичное связям внешних ключей между таблицами в реляционной базе данных;
- представление уникальных идентификаторов, подобных первичному ключу;
- спецификацию типов данных каждого индивидуального элемента и атрибута в XML-документе.
Для создания схемы данных в Visual Studio .NET в главном меню переходим File \ New \ File и выбираем из списка шаблонов (см. рис. 11.3) XML Schema. Появляется окно с надписью "Чтобы начать, перетащите объекты из окна Server Explorer или Toolbox на рабочую область (область дизайна) или щелкните правой кнопкой" (рис. 11.1):
Дело в том, что мы находимся в режиме дизайна. Переключаемся в режим кода, для чего нажимаем на кнопку(XML):
<?xml version="1.0" encoding="utf-8" ?> <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:mstns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> </xs:schema>
Первая строка - это уже знакомое указание на то, что схема представляет собой XML-документ с корневым элементом xs:schema. Префикс xs: предваряет все элементы схемы, указывая на свое пространство имен. Во второй строке располагается длинное, подробное и зачастую совершенно ненужное описание схемы (сравните с аналогичным кодом для HTML-страниц). Для корректной работы вполне достаточно ограничиться следующим представлением:
<?xml version="1.0" encoding="utf-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> </xs:schema>
Впрочем, встроенные средства визуализации студии предполагают наличие этой "шапки", поэтому ее не следует удалять. Создание схемы, описывающей заданный XML-документ в среде Visual Studio .NET - довольно простая задача. Создадим следующий документ XMLEasy.xml:
<?xml version="1.0" encoding="utf-8" ?> <TOUR> <IDTOUR>1</IDTOUR> </TOUR>
Переключаемся на вкладку(Data) и видим всего одну запись (рис. 11.2).
Создать схему, описывающую этот документ, можно несколькими способами: в главном меню выбрать пункт "XML \ Create Schema" (рис. 11.3, А), в режиме XML в контекстном меню выбрать этот же пункт (рис. 11.3, Б), в режиме Data в контекстном меню выбрать этот пункт (рис. 11.3, В), и, наконец, в режиме Data нажать на кнопку панели инструментов XML (рис. 11.3, Г).
В любом случае появляется схема документа в виде таблицы (рис. 11.4). Оставим пока режим Schema и переключимся в режим(XML).
Среда сгенерировала XML-код, описывающий структуру документа:
<?xml version="1.0"?> <xs:schema id="NewDataSet" targetNamespace="http://tempuri.org/XMLEasy.xsd" xmlns:mstns="http://tempuri.org/XMLEasy.xsd" xmlns="http://tempuri.org/XMLEasy.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified"> <xs:element name="TOUR"> <xs:complexType> <xs:sequence> <xs:element name="IDTOUR" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:Locale="ru-RU" msdata:EnforceConstraints="False"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element ref="TOUR" /> </xs:choice> </xs:complexType> </xs:element> </xs:schema>
Сюда входит также описание, необходимое для дальнейшего манипулирования схемой при помощи объектов ADO .NET. В исходном документе XMLEasy.xml появилась ссылка на схему данных:
<TOUR xmlns="http://tempuri.org/XMLEasy.xsd">
Документ XMLEasy.xsd был автоматически создан в той же самой директории, где находится XMLEasy.xml.
Для того чтобы научиться понимать схемы XSD, вначале следует поработать с описанием данных в чистом виде, без дополнительных элементов. В таблице 11.1 приводится несколько простейших XML-документов и их схем, сформированных без привязки к объектам ADO .NET.
Содержимое XML-документа | Содержимое XSD-схемы |
---|---|
<?xml version="1.0" encoding="utf-8"?> <!-- Документ называется XMLEasy.xml --> <TOUR xmlns= "http://tempuri.org/XMLEasy.xsd"> <IDTOUR>1</IDTOUR> </TOUR> |
<?xml version="1.0" encoding="utf-8" ?> <!-- Схема называется XMLEasy.xsd --> <xs:schema xmlns:xs= "http://www.w3.org/2001/XMLSchema"> <xs:element name="TOUR"> <xs:complexType> <xs:sequence> <xs:element name="IDTOUR" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> |
Описание | |
В документе XMLEasy.xml элемент TOUR - корневой элемент, содержащий дочерний элемент IDTOUR. Общая схема для корневого элемента имеет следующий вид:<xs:element name="Название_элемента"> <xs:complexType> : Содержимое элемента ... </xs:complexType> </xs:element> <xs:element name="Название_элемента" type="xs:тип_данных" /> | |
Содержимое XML-документа | Содержимое XSD-схемы |
<?xml version="1.0" encoding="utf-8"?> <!-- Документ называется XMLTour5.xml --> <TABLE xmlns= "http://tempuri.org/XMLTour5.xsd"> <TOUR> <IDTOUR>1</IDTOUR> <NAME>Кипр</NAME> <PRICE>25 000,00р. </PRICE> <INFORMATION>В стоимость двух взрослых путевок входит цена одной детской (до 7лет)</INFORMATION> </TOUR> <TOUR> <IDTOUR>2</IDTOUR> <NAME>Греция</NAME> <PRICE>32 000,00р. </PRICE> <INFORMATION>В августе и сентябре действуют специальные скидки</INFORMATION> </TOUR> <TOUR> <IDTOUR>3</IDTOUR> <NAME>Таиланд</NAME> <PRICE>30 000,00р.</PRICE> <INFORMATION>Не включая стоимость авиабилета</INFORMATION> </TOUR> <TOUR> <IDTOUR>4</IDTOUR> <NAME>Италия</NAME> <PRICE>26 000,00р.</PRICE> <INFORMATION>Завтрак в отеле включен в стоимость путевки</INFORMATION> </TOUR> <TOUR> <IDTOUR>5</IDTOUR> <NAME>Франция</NAME> <PRICE>27 000,00р.</PRICE> <INFORMATION>Дополнительные экскурсии не входят в стоимость путевки</INFORMATION> </TOUR> </TABLE> |
<?xml version="1.0"?> <!-- Схема называется XMLTour5.xsd --> <xs:schema xmlns:xs= "http://www.w3.org/2001/XMLSchema"> <xs:element name="TABLE"> <xs:complexType> <xs:choice maxOccurs= "unbounded"> <xs:element name="TOUR"> <xs:complexType> <xs:sequence> <xs:element name= "IDTOUR" type= "xs:string" /> <xs:element name= "NAME" type="xs:string" /> <xs:element name="PRICE" type="xs:string" /> <xs:element name="INFORMATION" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> |
Описание | |
Корневой элемент TABLE содержит элемент TOUR, состоящий, в свою очередь, из группы дочерних элементов.
Элемент choice определяет выбор других элементов, причем значение "unbounded" (неограниченно) атрибута maxOccurs указывает на возможность неограниченного наличия групп TOUR.<xs:element name= "TABLE" > <xs:complexType> <xs:choice maxOccurs= "unbounded"> <xs:element name="TOUR"> <xs:complexType> : : </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> | |
Содержимое XML-документа | Содержимое XSD-схемы |
<?xml version="1.0" encoding="utf-8" ?> <!-- Документ называется XMLTour6.xml --> <TABLE xmlns= "http://tempuri.org/XMLTour5.xsd"> <TOUR> <IDTOUR>1</IDTOUR> <NAME>Кипр</NAME> <PRICE>25 000,00р. </PRICE> <CLOSED>1</CLOSED> <INFORMATION>В стоимость двух взрослых путевок входит цена одной детской (до 7лет)</INFORMATION> </TOUR> </TABLE> |
<?xml version="1.0" ?> <xs:schema xmlns:xs= "http://www.w3.org/2001/XMLSchema"> <xs:element name="TABLE"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element name="TOUR"> <xs:complexType> <xs:sequence> <xs:element name="IDTOUR" type="xs:int" /> <xs:element name="NAME" type="xs:string" /> <xs:element name="PRICE" type="xs:string" /> <xs:element name="CLOSED" type="xs:boolean"/> <xs:element name="INFORMATION" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> |
Описание | |
Для элемента IDTOUR был установлен тип данных int, для элемента CLOSED - тип boolean, для остальных - по умолчанию тип string. Изменять тип данных можно непосредственно в режиме XML-схемы данных, но более удобно - в режиме Schema (в данном случае режим будет называться DataSet ) выбирать тип данных из выпадающего списка (рис. 11.5): |
В программном обеспечении к курсу вы найдете все файлы этой таблицы в папке XSD (Code\Glava5\ XSD).
Задание типа данных в XML-документе (последний пример - табл. 11.1) - один из способов ограничения содержимого. Для ограничения значения заданного типа применяются дополнительные атрибуты. В следующем фрагменте схемы значение элемента PRICE должно быть в пределах от 50 до 100:
<xs:element name="PRICE" > <xs:simpleType> <xs:restriction base="xs:int" > <xs:minInclusive value="50"/ > <xs:maxInclusive value="100"/ > </xs:restriction> </xs:simpleType> </xs:element>
Для ограничения XML-документа некоторыми фиксированными значениями используется следующая конструкция:
<xs:element name="NAME" > <xs:simpleType> <xs:restriction base="xs:string" > <xs:enumeration value="Кипр"/ > <xs:enumeration value="Греция"/ > <xs:enumeration value="Таиланд"/ > <xs:enumeration value="Италия"/ > <xs:enumeration value="Франция"/ > </xs:restriction> </xs:simpleType> </xs:element>
Здесь элемент NAME может принимать только одно фиксированное значение из пяти названий стран.
Разработка XSD-схемы представляет собой довольно кропотливую работу. Визуальные средства среды Visual Studio .NET значительно облегчают эту задачу. Для освоения основных концепций желательно изучить несколько схем XML-документов, созданных автоматически. В таблицах 11.2-11.4 приводится описание основных элементов и атрибутов, которые при этом можно встретить.
Атрибут | Описание |
---|---|
abstract | Задание элемента абстрактного типа |
attributeFormDefault | Задание свойств локальных атрибутов как глобальных |
base | Базовый тип элемента |
block | Запрещенное выведение ограничением (derivations-by-restriction) |
blockDefault | Задание начального ограничения block на все определения типов |
default | Значение элемента или атрибута по умолчанию |
elementFormDefault | Задание свойств локального элемента как глобально определенного |
fixed | Фиксированное значение элемента или атрибута |
form | Локально объявленные элементы определяются в конкретных экземплярах документов |
itemType | Тип пунктов списка |
memberTypes | Тип членов, использованных в объединении ( union ) |
maxOccurs | Максимальное количество вхождений элемента |
minOccurs | Минимальное количество вхождений элемента |
mixed | Задание элемента, имеющего смешанный тип |
name | Название элемента или атрибута |
namespace | Пространство имен |
noNamespace | Задание местоположения документа-схемы, |
SchemaLocation | не имеющего результирующих пространств имен |
nillable | Определение того, что элемент может иметь пустое значение NULL ( nil ) |
ref | Задание ссылки на глобально определенный элемент |
schemaLocation | Определение местоположения схемы |
substitutionGroup | Определение замены элементов другими элементами |
targetNamespace | Результирующее пространство имен схемы |
type | Тип элемента |
use | Является элемент обязательным или нет |
value | Значение элемента схемы |
xsi:nil | Задание реального содержания пустого ( NULL ) элемента XML-документа |
xsi:schemaLocation | Реальное местоположение элемента в XML-документе |
xsi:type | Реальный тип элемента в XML-документе |