Описание элементов в XML Schema

Элементы бывают простыми и сложными.

Простые элементы не могут иметь атрибуты и содержимое смешанного типа, а сложные – могут. Содержимое смешанного типа – это возможность использовать внутри элемента дочерние элементы и текст (смешанное содержимое) .Простые определяются с помощью вложенного элемента <xs:simpleType>, сложные - <xs:complexType>.

Последовательность элементов и типов не играет роли. Схема будет работать в любом случае.

Элементы обладают обязательными атрибутами name и type, определяющими имя элемента и его тип. Например: <xs:element name="computer" type="xs:string">

В схемах XML поддерживаются все наиболее распространенные в языках программирования типы данных, а именно:

xs:string – строковый (символьный) тип

xs:decimal - десятичное число

xs:boolean – true/false

xs:float – число с плавающей точки

xs:date (1950-03-26) - дата

xs:time (15:30:01) - время

и др.

Второй способ написания XML Schema (первый в примере выше), который основывается на том, чтобы описывать тип сразу внутри элемента. Данный способ подойдет в том случае, если вы не планируете использовать одно и то же описание для разных элементов.

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequance>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="xs:integer" />
</xs:sequance>
</xs:complexType>
</xs:element>
</xs:schema>

Элемент объявляется при помощи специальной конструкции «element» с использованием соответствующего префикса. В данном случае мы определяем элемент с названием «root» без указания типа (type), так как он будет описан внутри элемента. То есть, есть два способа описания элементов.

Способ

<xs:element name="название элемента" type="название типа" />
<xs:complexType name="название типа">
Описание типа
</xs:complexType>

Способ

<xs:element name="root">
Описание типа элемента
</xs:element>

Вы можете использовать как первый способ, так и второй. Все они работают одинаково. Вопрос лишь в удобстве в данном конкретном случае.

Далее после объявления элемента мы указываем, что он комплексного типа (<xs:complexType>) и перечисляем (<xs:sequance>) вложенные элементы. В данном случае это элементы name и age с типами «xs:string» и «xs:integer». Префикс xs означает, что это базовый тип, который уже описан в стандарте XML Schema.

Запись атрибутов:

<attribute

default = string

fixed = string

form = (qualified | unqualified)

id = ID

name = NCName

ref = QName

type = QName

use = (optional | prohibited | required): optional

{any attributes with non-schema Namespace...}>

Content: (annotation?, (simpleType?))

</attribute>

Атрибут sequence определяет фиксированный порядок вхождений дочерних элементов. Если порядок не важен, необходимо использовать choice. В этом случае допускается и по несколько вхождений, число которых можно управлять:

minOccurs="2" - минимальной количество 2

maxOccurs="10" - максимальное количество 10

maxOccurs="unbounded" - неограниченное число.

Пример:

<xs:element name="zooAnimals">

<xs:complexType>

<xs:sequence minOccurs="0" maxOccurs="unbounded">

<xs:element name="elephant"/>

<xs:element name="bear"/>

<xs:element name="giraffe"/>

</xs:sequence>

</xs:complexType>

</xs:element>.

Простые и комплексные типы в XML Schema. Типы атрибутов.

Элементы бывают простыми и сложными (комплексными).

Простые элементы не могут иметь атрибуты и содержимое смешанного типа, а сложные – могут. Содержимое смешанного типа – это возможность использовать внутри элемента дочерние элементы и текст (смешанное содержимое) .

Простые определяются с помощью вложенного элемента <xs:simpleType>.

Сложные определяются с помощью <xs:complexType> (спецификация по адресу: http://msdn.microsoft.com/ru-ru/library/vstudio/ms256067(v=vs.90).aspx).

В отличие от простых элементов сложные элементы могут иметь атрибуты и содержимое смешанного типа. Последовательность появления дочерних элементов определяется с помощью конструкции <xs:sequence>

Например, сложный элемент Computer с установленной последовательностью появления элементов (сначала HDD, потом Motherboard) можно определить так:

<xs:complexType name=”Computer”>

<xs:sequence>

<xs:element name=”HDD” type=”xs:string”/>

<xs:element name=”Motherboard” type=”xs:string”/>

</xs:sequence>

<xs:attribute name=”model” type=”xs:string” fixed=”NewModel”/>

<xsd:complexType>

Объявление атрибута:

<attribute

default = string

fixed = string

form = (qualified | unqualified)

id = ID

name = NCName

ref = QName

type = QName

use = (optional | prohibited | required): optional

{any attributes with non-schema Namespace...}>

Content: (annotation?, (simpleType?))

</attribute>

Default

Атрибут со значением по умолчанию. Если атрибут не указан в экземпляре внутри XML-документа, атрибуту присваивается заданное значение. Если атрибут не присутствует в экземпляре документа, то он должен отобразиться в модуле проверки после обработки схемы. Обработчики схемы должны действовать таким образом, будто атрибуту задано значение по умолчанию и он фактически не находится в документе экземпляра. Атрибуты Default и fixed не могут присутствовать одновременно.

Необязательный.

Fixed

Атрибут с фиксированным значением. Если атрибут присутствует в экземпляре документа, его значение должно быть равным заданному фиксированному значению. Если атрибут не присутствует, то атрибут получает указанное значение. Атрибуты Default и fixed не могут присутствовать одновременно.

Необязательный.

Type

Имя встроенного типа данных или простого типа данных, определенного в этой схеме (или другой схеме, указанной конкретным пространством имен). Тип должен быть именем QName. Этот тип может включать префикс пространства имен. Атрибут type может присутствовать, только если в содержимом не содержится элемент simpleType.

Необязательный.

Типы атрибутов по способу использования:

Выражается через значение параметраuse(Необязательный).

Если этот атрибут указан, то он должен принять одно из следующих значений.

optional -атрибут является необязательным и может принимать любое значение. Это значение по умолчанию. Следующие примеры эквивалентны.

<xs:attribute name="myattr" type="xs:string"/>

<xs:attribute name="myattr" type="xs:string" use="optional"/>

prohibited -атрибут нельзя использовать. Этот атрибут используется в ограничении другого сложного типа, чтобы запретить использование существующих атрибутов.

<xs:complexType name="A">

<xs:attribute name="x" type="xs:NCName"/>

<xs:attribute name="y" type="xs:QName"/>

</xs:complexType>

<xs:complexType name="B">

<xs:complexContent>

<xs:restriction base="xs:A">

<xs:attribute name="x" use="required" />

<xs:attribute name="y" use="prohibited"/>

</xs:restriction>

</xs:complexContent>

</xs:complexType>

required -атрибут должен отобразиться один раз (обязательно).

Атрибут необходим и может принимать любое значение, допускаемое определением типа этого атрибута.

<xs:attribute name="myattr" type="xs:string" use="required"/>

Атрибут используется в ограничении или расширении другого сложного типа, он требует существования конкретного атрибута или атрибутов.

<xs:complexType name="A">

<xs:attribute name="x" type="xs:NCName"/>

<xs:attribute name="y" type="xs:QName"/>

</xs:complexType>

<xs:complexType name="B">

<xs:complexContent>

<xs:restriction base="xs:A">

<xs:attribute name="x" use="required" />

<xs:attribute name="y" use="prohibited"/>

</xs:restriction>

</xs:complexContent>

</xs:complexType>

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