Файлы определения схемы документа
Согласно современному стандарту, валидный документ должен соответствовать связанному с ним файлу XSD (XML Schema Definition) — файлу определения схемы XML, который определяет конкретный язык, то есть описывает, какие элементы и типы могут появляться в документе. Схемы XSD призваны заменить DTD (Document Type Definition), разница между ними заключается в том, что файлы XSD сами тоже используют синтаксис XML. Схемы XSD позволяют определить, какие теги разрешены, обязательны они или нет, могут ли повторяться в документе и так далее. Таким образом, XML описывает данные, а XSD — структуру этих данных, или метаданные. В терминах программирования, XSD — описание типов, в то время как в XML-файле описаны объекты этих типов. По адресу http://www.w3.org/TR/2003/WD-xmlschema-11-req-20030121/ находится рабочий проект стандарта XSD 1.1.
Файл описания схемы начинается с описания префикса пространства имен, который включается затем во все элементы этого файла. Адрес http://tempuri.org предназначается для задания URI для пространств имен ASP .NET:
<xs:schema id="XMLSchema2" targetNamespace= "http://tempuri.org/XMLSchema2.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema2.xsd" xmlns:mstns="http://tempuri.org/XMLSchema2.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
Создавая схемы XSD, можно:
1. декларировать элементы и атрибуты.
<xs:element name="Author" type="xs:string" default="Пушкин" minOccurs="1" maxOccurs="1" />
Например, это определение задает, что элемент "Author" строкового типа, должен появляться один и только один и раз, и если он не указан, то принимает значение "Пушкин".
<xs:element name="Child" type=" xs:string" maxOccurs="unbounded"/>
Параметр maxOccurs="unbounded" указывает, что элемент может встречаться любое количество раз.
Параметр ref позволяет ссылаться на уже описанный в данном файле глобальный элемент или атрибут, чтобы избежать повторного описания одних и тех же элементов.
2. определить простые и сложные типы.
В XSD есть предопределенные типы — примерно такие же, как в .NET. Во время работы приложения они преобразуются в типы .NET. На их основании можно строить сложные типы, похожие на структуры языков программирования. Сложный тип состоит из последовательности описаний элементов. Определим сложный тип:
<xs:complexType name="Quote"> <xs:sequence> <xs:element name="Text" type="xs:string" minOccurs="1" maxOccurs="1" /> <xs:element name="Author" type="xs:string" default="Пушкин" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:complexType>
Тег <xs:sequence> определяет, что элементы в данном типе должны появляться в заданном порядке. Если бы использовался тег <xs:all>, то порядок появления элементов мог бы быть любым.
Тег <xs:choice> похож на структуру с вариантами.
Он определяет, что в элементе данного типа должен быть только один из вложенных элементов:
<xs:complexType name="StateProvinceType"> <xs:choice> <xs:element name="State" type="xs:string"/> <xs:element name="Province" type="xs:string"/> </xs:choice> </xs:complexType>
Простые типы тоже строятся на основе стандартных типов, накладывая разные ограничения. Типы могут быть глобальными или вложенными в определение элементов. В предыдущем примере определен глобальный сложный тип Quote.
Глобальный тип можно использовать в определении элементов:
<xs:element name="Quote" type="Quote" maxOccurs="unbounded" />
В следующем примере определен простой тип, вложенный в определение элемента MyValue:
<xs:element name="MyValue" type="MyInteger"/> <xs:simpleType name="MyInteger"> <xs:restriction base="xs:positiveInteger"> <xs:minInclusive value="1"/> <xs:maxInclusive value="10"/> </xs:restriction> </xs:simpleType>
Значениями этого типа могут быть целые положительные числа от 1 до 10.
Простой тип может быть перечислением:
<xs:simpleType name="Answers"> <xs:restriction base="xs:string"> <xs:enumeration value="yes"> </xs:enumeration> <xs:enumeration value="no" /> <xs:enumeration value="don't know" /> </xs:restriction> </xs:simpleType>
3. добавлять новые группы и группы атрибутов.
В определении сложного типа могут фигурировать атрибуты. Предположим, мы хотим построить схему такого файла:
<?xml version="1.0" encoding="utf-8" ?> <FilmChoices> <Film Title='Броненосец "Потемкин"'> <Year>1925</Year> <Director>Эйзенштейн</Director></Film> <Film Title="Война и мир"> <Year>1967</Year> <Director>Сергей Бондарчук</Director> </Film> <Film Title ="Девятая рота"> <Year>2005</Year> <Director>Федор Бондарчук</Director> </Film> </FilmChoices>
Необходимо потребовать наличие атрибута Title:
<xs:attribute name="Title" type="xs:string" use="required"/>
Атрибуты могут быть только простых типов.
4. добавлять аннотации.
Аннотации позволяют вставлять описание существующих элементов — таким образом, в файл добавляется документация:
<xs:complexType name="Quote"> <xs:annotation> <xs:documentation> Цитаты разных авторов </xs:documentation> </xs:annotation>
<xs:documentation> предназначается для читателей файла, а <xs:appinfo> — для обрабатывающих файл программ.
Полное описание синтаксиса XSD можно прочитать по адресу http://www.w3.org/2001/XMLSchema.xsd.
Редактировать XSD-файлы в Visual Studio 2005 можно и через исходный код, и с помощью дизайнера. Для XML-документа можно автоматически сгенерировать соответствующую ему схему.В окне свойств XML-документа можно задать как файл схемы, так и файл преобразования. В таком случае студия автоматически проверяет файл на соответствие схеме и IntelliSense даже подставляет теги из этого файла.