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

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

<?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 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): | |
| 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 | Элемент или атрибут, который должен иметь уникальное значение |
| 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-документе |