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

       

XML-схемы данных (XSD)


Схемы данных1) XSD (XML Schema Document, XSD) представляют собой альтернативный способ правил построения XML-документов. По сравнению с DTD, схемы обладают более мощными средствами для определения сложных структур данных, обеспечивают более понятный способ описания грамматики языка, способны легко модернизироваться и расширяться. Схема XSD может содержать следующую информацию:

  • представление связей между элементами данных, аналогичное связям внешних ключей между таблицами в реляционной базе данных;
  • представление уникальных идентификаторов, подобных первичному ключу;
  • спецификацию типов данных каждого индивидуального элемента и атрибута в XML-документе.

Для создания схемы данных в Visual Studio .NET в главном меню переходим File \ New \ File и выбираем из списка шаблонов (см. рис. 11.3) XML Schema. Появляется окно с надписью "Чтобы начать, перетащите объекты из окна Server Explorer или Toolbox на рабочую область (область дизайна) или щелкните правой кнопкой" (рис. 11.1):


Рис. 11.1.  Создание новой XSD-схемы

Дело в том, что мы находимся в режиме дизайна. Переключаемся в режим кода, для чего нажимаем на кнопку

(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).


Рис. 11.2.  Документ XMLEasy.xml в режиме просмотра Data

Создать схему, описывающую этот документ, можно несколькими способами: в главном меню выбрать пункт "XML \ Create Schema" (рис. 11.3, А), в режиме XML в контекстном меню выбрать этот же пункт (рис. 11.3, Б), в режиме Data в контекстном меню выбрать этот пункт (рис. 11.3, В), и, наконец, в режиме Data нажать на кнопку панели инструментов XML (рис. 11.3, Г).


Рис. 11.3.  Различные способы создания XSD схемы в среде Visual Studio .NET

В любом случае появляется схема документа в виде таблицы (рис. 11.4). Оставим пока режим Schema и переключимся в режим
(XML).


Рис. 11.4.  Схема документа. Для наглядности для трех всплывающих подсказок был сделан коллаж

Среда сгенерировала 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.



Таблица 11.1. Примеры составления XSD-схем Содержимое XML-документаСодержимое XSD-схемыОписаниеСодержимое XML-документаСодержимое XSD-схемыОписаниеСодержимое 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 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 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>


Рис. 11.5.  Типы данных схемы XSD



Для элемента 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 приводится описание основных элементов и атрибутов, которые при этом можно встретить.

Таблица 11.2. Элементы XSD-схемЭлементОписание
all Вложенные элементы могут определяться в произвольном порядке
annotation Родительский элемент элементов-комментариев <appInfo> и <documentation>
any Любые вложенные элементы
anyAttribute Любые атрибуты
appInfo Элемент-коментарий. Задает титул схемы
attribute Атрибут
attributeGroup Группа атрибутов
choice Выбор других элементов. Аналог оператора "|" в DTD
complexContent Ограничения или расширения модели содержимого сложного типа
complexType Элемент сложного типа
documentation Элемент-комментарий. Предоставляет информацию о схеме
element Элемент
extension Расширения элемента
field Объявление поля. Применяется внутри элемента <unique> для определения полей
group Группа элементов
import Импорт декларации типов из другой схемы
include Включение другой схемы в существующее пространство имен
key Задание элемента или атрибута с ключом, указывающим на другой элемент
keyref Задание элемента или атрибута, на который указывает ключ
list Элемент, который может содержать список значений
redefine Переопределение уже объявленных элементов
restriction Ограничение элемента
schema Корневой элемент схемы
selector Селектор для отбора XML-элементов
sequence Последовательность других элементов. Аналог оператора "," в DTD
simpleContent Модель, содержимое которой представляет только символьные данные
simpleType Элемент простого типа
union Элемент или атрибут, который может иметь множественное значение
unique Элемент или атрибут, который должен иметь уникальное значение
<


table class="xml_table" cellpadding="2" cellspacing="1">

Таблица 11.3. Атрибуты - ограничения XSD-схемАтрибутОписаниеenumeration Список значенийlength ДлинаmaxLength Максимальная длинаminLength Минимальная длинаmaxExclusive Максимальное значениеmaxInclusive Максимальное значение включительноminExclusive Минимальное значениеminInclusive Минимальное значение включительноfractionDigits Количество знаков после запятой в дробных числахtotalDigits Количество цифрpattern Образец (паттерн) содержимого элементовwhiteSpace Количество пробелов в содержимом элементов Таблица 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-документе

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