Беларусь, Минск |
Лабораторная работа № 2
Описание схемы документа на языке XSD
Связать XML документ с его XSD схемой можно разными способами:
- подать файлы со схемой на вход анализатора.
- задать файлы со схемой как свойство анализатора.
- указать прямо в документе XML.
Рассмотрим 3 способ более подробно.
Если элементы документа не принадлежат никакому пространству имен и записаны без префикса, то в корневом элементе документа записывается атрибут noNamespaceSchemaLocation, указывающий расположение файла со схемой в форме URI:
< root_element_name xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="file_name.xsd">
В этом случае в схеме не должно быть целевого пространства имен.
Если же элементы документа относятся к некоторому пространству имен, то применяется атрибут schemaLocation, в котором через пробел перечисляются пространство имен и расположение файла со схемой, описывающей это пространство имен.
Элементы, из которых будет состоять документ XML, объявляются в схеме компонентом element:
<xsd:element_name="имя элемента" tуре="тип элемента" minOccurs="Haменьшее число появлений элемента в документе" maxOccurs="наибольшее число появлений" />
Значение по умолчанию необязательных атрибутов minOccurs и maxOccurs равно 1. Это означает, что если эти атрибуты отсутствуют, то элемент должен появиться в документе XML ровно один раз.
Указание типа элемента в атрибуте type удобно, если это встроенный простой тип или тип, определенный заранее. Тогда в атрибуте type можно записать только имя типа.
Если же тип элемента определяется здесь же, то определение типа элемента лучше вынести:
<xsd:element name="имя элемента">
</xsd:element>
Объявление атрибута элемента тоже несложно:
<xsd:attribute name=" имя атрибута" type="тип атрибута" use="обязательность атрибута" default="значение по умолчанию" />
Необязательный атрибут use принимает три значения:
- optional - описываемый атрибут необязателен (это значение по умолчанию);
- required - описываемый атрибут обязателен;
- prohibited - описываемый атрибут неприменим. Это значение полезно при определении подтипа, чтобы отменить некоторые атрибуты базового типа.
Определение типа атрибута, - а это должен быть простой тип, - можно вынести в содержимое элемента attribute:
<xsd:attribute name="имя атрибута">
Тип атрибута
</xsd:attribute>
Определение простых типов
Простой тип в схемах XML определяется компонентом схемы simpleType, имеющим вид
<xsd:simpleType name="имя типа" >Определение типа</xsd:simpleType"
Определение новых типов простых элементов
Кроме встроенных типов в схемах XML можно определить новые типы простых элементов. Они вводятся как
- сужение (restriction) встроенного или ранее определенного простого типа,
- список (list) простых типов
- объединение (union) простых типов.
Сужение простого типа определяется компонентом restriction, в котором атрибут base указывает сужаемый простой тип, а в содержимом задаются ограничения, выделяющие определяемый простой тип.
Теги задающие ограничения, называются фасетками ( facets ). Вот их список:
- <maxExclusive> - наибольшее значение, которое уже не входит в определяемый тип;
- <maxInclusive> - наибольшей значение определяемого типа;
- <minExclusive> - наименьшее значение, уже не входящее в определяемый тип;
- <minInclusive> - наименьшее значение определяемого типа;
- <totalDigits> - общее количество цифр в определяемом числовом типе - сужении типа decimal;
- <fractionDigits> - количество цифр в дробной части числа;
- <length> - длина значений определяемого типа;
- <maxLength> - наибольшая длина значений определяемого типа;
- <minLength> - наименьшая длина значений определяемого типа;
- <enumeration> - одно из перечислимых значений;
- <pattern> - регулярное выражение;
- <whitespace> - применяется при сужении типа string и определяет способ преобразования пробельных символов <'>\n<'>, <'>\r<'>, <'>\t. Атрибут value этого тега принимает одно из трех значений:
В тегах-фасетках можно записывать следующие атрибуты, называемые базисными фасетками ( fundamental facets ):
-
ordered - задает упорядоченность определяемого типа, принимает одно из трех значений:
- false - тип неупорядочен;
- partial - тип частично упорядочен;
- total - тип полностью упорядочен;
- bounded - задает ограниченность или неограниченность типа значением true или false;
- cardinality - задает конечность или бесконечность типа значением finite или countably infinite;
- numeric - показывает, числовой этот тип или нет, значением true или false.
Список определяется компонентом list, в котором атрибутом itemType указывается тип элементов определяемого списка. Тип элементов списка можно определить и в содержимом элемента list.
При определении списка можно применять фасетки <length>, <minLength>, <maxLength>, <enumeration>, <pattern>.
Простой тип-объединение определяется компонентом union, в котором атрибутом memberTypes можно указать имена объединяемых типов. Например:
<xsd: union memberTypes="xsd: string xsd; integer lisstOfInteger" />
Другой способ - записать в содержимом компонента union определения простых типов, входящих в объединение.