Объявление элементов и их атрибутов. Связь документа 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 описываются элементы, входящие в сложный тип, и/или атрибуты открывающего тега.

Определение сложного типа можно разделить на три группы:

· определение типа пустого элемента;

· определение типа элемента с простым телом;

· определение типа элемента, содержащего вложенные элементы.

Рассмотрим эти определения подробнее.

Наши рекомендации