Объявление элементов и их атрибутов. Связь документа XML со своей схемой
Объявление элементов и их атрибутов
Элементы, из которых будет состоять документ XML, объявляются в схеме компонентом element:
<xsd:element name="имя элемента" type="тип элемента"
minOccurs="наименьшее число появлений элемента в документе"
maxOccurs="наибольшее число появлений" />
Значение по умолчанию необязательных атрибутов minOccurs и maxOccurs равно 1. Это означает, что если эти атрибуты отсутствуют, то элемент должен появиться в документе XML ровно один раз. Например:
<xsd:element name="degree" type="xsd:nonPositiveInteger" />
Указание типа элемента в атрибуте type удобно, если это встроенный простой тип или тип, определенный заранее. Тогда в атрибуте typeможно записать только имя типа. Если же тип элемента определяется здесь же, то определение типа элемента лучше вынести в содержимое компонента element:
<xsd:element name="имя элемента" >
Определение типа элемента
</xsd:element>
Объявление атрибута элемента тоже несложно:
<xsd:attribute name=" имя атрибута" type="тип атрибута" use="обязательность атрибута" default="значение по умолчанию" />
Необязательный атрибут use может принимать одно из трёх значений:
· optional — описываемый атрибут необязателен (это значение по умолчанию);
· required — описываемый атрибут обязателен;
· prohibited — описываемый атрибут неприменим. Это значение полезно при определении подтипа, чтобы отменить некоторые атрибуты базового типа.
Например:
<xsd:attribute name="id" type="positiveInteger" use="required" />
Если описываемый атрибут необязателен, то атрибутом default можно задать его значение по умолчанию:
<xsd:attribute name="name" type="NCName" default="anonymous" />
Определение типа атрибута, — а это должен быть простой тип, — можно вынести в содержимое элемента attribute.
<xsd:attribute name="имя атрибута">
Тип атрибута
</xsd:attribute>
Связь документа XML со своей схемой
Программе-анализатору, проверяющей соответствие документа XML его схеме, надо как-то указать файлы (один или несколько), содержащие схему документа. Это можно сделать разными способами. Во-первых, можно подать эти файлы на вход анализатора. Так делает, например, проверяющий анализатор XSV (XML Schema Validator) (ftp://ftp.cogsci.ed.ac.uk/pub/XSV/):
$ xsv ntb.xml ntbl.xsd ntb2.xsd
Во-вторых, можно задать файлы со схемой как свойство анализатора, устанавливаемое методом setPropertyO, или значение переменной окружения анализатора. Так делает, например, проверяющий анализатор Xerces.
Эти способы удобны тогда, когда документ в разных случаях нужно связать с различными схемами. Если же схема документа фиксирована, то ее удобнее указать прямо в документе XML. Это делается одним из двух способов:
Если элементы документа не принадлежат никакому пространству имен и записаны без префикса, то в корневом элементе документа записывается атрибут noNamespaceSchemaLocation, указывающий расположение файла со схемой в форме URI:
<notebook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ntb.xsd">
В этом случае в схеме не должно быть целевого пространства имен, т. е. не следует использовать атрибут targetNamespace.
Если же элементы документа относятся к некоторому пространству имен, то применяется атрибут schemaLocation, в котором через пробел перечисляются пространство имен и расположение файла со схемой, описывающей это пространство имен. Продолжая пример предыдущего раздела, можно написать:
<notebook xmlns="http://some.firm.com/2003/ntbNames" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=
"http://some.firm.com/someNames A.xsd
http://some.firm.com/anotherNames B.xsd"
xmlns:prl="http://some.firm.com/someNames"
xmlns:pr2="http://some.firm.com/anotherNames">
После этого в документе можно использовать имена, определенные в схемах A.xsd и B.xsd, снабжая их префиксами pri и рг2 соответственно.
Определение сложных типов
Напомним, что тип элемента называется сложным, если в элемент вложены другие элементы и/или в открывающем теге элемента есть атрибуты. Сложный тип определяется компонентом complexType, имеющим вид:
<xsd:complexType name="имя типа" >
Определение типа
</xsd:complexType>
Необязательный атрибут name задает имя типа, а в содержимом компонента complexType описываются элементы, входящие в сложный тип, и/или атрибуты открывающего тега.
Определение сложного типа можно разделить на три группы:
· определение типа пустого элемента;
· определение типа элемента с простым телом;
· определение типа элемента, содержащего вложенные элементы.
Рассмотрим эти определения подробнее.