Описание элементов в 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>