Инструменты пользователя

Инструменты сайта


xml_schema

Назад

XML Schema — язык описания структуры XML-документа. Спецификация XML Schema, является рекомендацией W3C. Как большинство языков описания XML, XML Schema была задумана для определения правил, которым должен подчиняться документ. Но, в отличие от других языков, XML Schema была разработана так, чтобы её можно было использовать в создании программного обеспечения для обработки документов XML.

XML Schema отвечает за:

  • элементы, входящие в документ
  • атрибуты, допустимые в документе
  • дочерние элементы
  • порядок дочерних элементов
  • количество дочерних элементов
  • может ли элемент быть пустым или может содержать текст
  • типы элементов и атрибутов
  • фиксированные и значения по умолчанию элементов и атрибутов

При создание XSD схемы первой строкой нашей схемы будет указание его корневого элемента schema с определением пространства имен:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
............
</xs:schema>

Аннотации

Язык XML схем XSD поддерживает аннотации, которые позволяют задать краткое описание самой схемы, а также отдельных элементов ее содержания для удобства ее понимания в дальнейшем. Говоря другими словами, мы можем при описании XML схемы писать комментарии, предназначенные для чтения как человеком, так и прикладным приложением, которое будет обрабатывать вашу схему.

  • annotation - основной компонент, в котором описывается аннотация схеме. Он включает в себя два нижеописанных

компоненты.

  • documentation - компонент, который собственно и содержит описание схемы, информацию об авторских правах и т.д.. данный

компонент может иметь атрибут xml: lang, в котором указывается язык написания самой аннотации.

  • appInfo - компонент, который может использоваться для представления информации об инструментальных средствах

разработки, таблицы стилей и других приложений. Например, в середине компонента appInfo можно представить информацию о том, какие фасетки могут быть применены к каждому простого типа.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:documentation>
    Пишем здесь документацию к нашей схеме
    </xs:documentation>
  </xs:annotation>
</xs:schema>

Типы данных

НазваниеРазмерОписание
<color blue>Действительные числа</color>
decimalНет ограничения по разрядности (мантиссы) числа, но требуется, чтобы можно было записать не менее 18 цифр
floatДействительные значения с одинарной точностью
doubleДействительные значения с двойной точностью
<color blue>Целые числа</color>
long8-9 223 372 036 854 775 808 .. +9 223 372 036 854 775 807
іnteger (int)4-2 147 483 648 .. +2 147 483 647
short2-32 758 .. + 32 767
byte1-128 .. +127
<color blue>Cтроковые типы</color>
stringПроизвольный строка символов
normalizedStringПодтип string, не содержит следующих символов: '\ n', '\ t' и '\ r'. Фактически, перед обработкой схемы, эти символы перетворються в пробелы.
<color blue>Дата и время</color>
dateTimeСодержит дату в формате CCYY-MM-DDThh: mm: ss, например, 2006-07-12Т10: 30:02
timeВремя в формате hh: mm: ss
dateДата в формате CCYY-MM-DD
gYearMonthВремя и месяц в формате CCYY-MM
gMonthDayМесяц и день в формате-MM-DD
<color blue>Другие встроенные простые типы</color>
anyURIURI-адреса
NOTATIONИспользуется для записи математических, химических и других символов, нот, азбуки Бройля и других обозначений

Объявление элемента

Для описания элемента, который будет входить в XML документа, в схеме используется компонент element, который имеет следующий синтаксис применения:

<xs: element name = "название элемента"
[type = "тип элемента"]
[minOccurs = "наименьшее кол-во появлений элемента в документе"]
[maxOccurs = "наибольшие кол-во появлений элемента в документе"] />

Необязательные атрибуты minOccurs и maxOccurs определяют частоту появления данного элемента в XML документе. Значение по умолчанию для них равное 1. Это означает, что если эти атрибуты отсутствуют, то элемент должен появиться в документе XML ровно 1 раз. Значение атрибута minOccurs установлено в 0 указывает на то, что элемент может быть вообще отсутствовать в документе, а maxOccurs со значением unbounded определяет, что максимальное количество появления элемента не ограничено.

<xs:element name="rating" type="xs:integer" minOccurs="unbounded" />

Обратите также внимание на то, что при указании типа элемента обязательно необходимо задавать пространство имен:

type="xs:integer"

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

Объявление атрибутов для XML документа схоже с объявлением элемента и имеет следующий вид:

<xs: attribute name = "название атрибута"
[type = "тип атрибута"]
[use = "обязательный атрибут"]
[default = "значение по умолчанию"]
[fixed = "значение по умолчанию"] />

Необязательный атрибут use может принимать одно из следующих значений:

  • optional - атрибут является необязательным (значение по умолчанию);
  • required - атрибут является обязательным;
  • prohibited - атрибут запрещен.

Простые и комплексные типы данных

  • Простыми (simple) элементами описуемого документа XML считаются элементы, которые не содержат атрибутов и вложенных элементов. В простых типов данных следует отнести встроенные типы (decimal, float, double, string, name и т.д.).
  • Сложные (complex) элементы - это элементы, которые могут содержать другие элементы и / или хотя бы один атрибут.

Простые типы элементов описываются компонентом simpleType, а сложные типы - complexType.

simpleType

Простые типы в основном используются для сужение типов (restriction)

Схема:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:simpleType name="SalaryType">
		<xs:restriction base="xs:decimal">
			<xs:minInclusive value="10000"/>
			<xs:maxInclusive value="90000"/>
		</xs:restriction>
	</xs:simpleType>
 
	<xs:element name="Employee">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Salary" type="SalaryType"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
 
</xs:schema>

XML:

<?xml version="1.0"?>
<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Salary>55000</Salary>
</Employee>

Cужение типов (restriction)

С помощью сужение типов (restriction) Мы можем контролировать любой тип данных на наличие его значения то есть ограничивать его значения
Приме: Схема

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
        <xs:simpleType name="SalaryType">
		<xs:restriction base="xs:decimal">
			<xs:minInclusive value="10000"/>
			<xs:maxInclusive value="90000"/>
		</xs:restriction>
	</xs:simpleType>
 
	<xs:element name="Employee">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Salary" type="SalaryType"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
 
</xs:schema>

XML:

<?xml version="1.0"?>
<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Salary>55000</Salary>
</Employee>
Название фасеткиОписание
<maxExclusive>Наибольшее значение, которое больше не входит в определяем тип
<maxInclusive>Наибольшее значение определяемого типа
<minExclusive>Наименьшее значение, которое больше не входит в Определяемый тип
<minInclusive>Наименьшее значение определяемого типа
<totalDigits>Общее количество цифр в определяемого числовом типе; сужение типа decimal
<fractionDigits>Количество цифр в дробной части числа
<length>Длина значений определяемого типа
<maxLength>Наибольшая длина значений определяемого типа
<minLength>Наименьшее длина значений определяемого типа
<enumeration>Одно из перечисленных значений
<pattern>Регулярное выражение
<whiteSpace> - - -

В тегах-фасетка также могут иметь атрибуты. Эти атрибуты называют базисными фасетками (fundamental facets). Среди них выделяют:

Базисная фасеткаОписание
ordered Задает упорядоченность определяет моего типа и может принимать одно из следующих значений: False - тип неупорядоченный; Partial - тип частично упорядоченное; Total - тип полностью упорядочен.
boundedЗадает ограниченность или неограниченность типа значением true или false
cardinalityЗадает конечность или бесконечность типа значением finite или countably infinite
numericПоказывает, значение является числовым типом. Может принимать значения true или false

Пример:

<xs:simpleType name="Year">
<xs:restriction base="xs:gYear">
<xs:minInclusive value="1700"/> <!-- минимального введения значения года - 1700-->
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DateType">
<xs:restriction base="xs:date">
<xs:minInclusive value="2003-01-01"/> <!-- минимальная дата -->
<xs:maxInclusive value="2003-12-31"/> <!-- максимальная дата -->
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TypeId">
<xs:restriction base="xs:integer">
<xs:minInclusive value="10000" /> <!-- минимальное значение >= 10 000 -->
<xs:pattern value="[1-7][0-7]{4}" /> <!-- шаблон на ввод -->
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="genderType">
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/> <!--шаблон на ввод одного из двух значений-->
</xs:restriction>
</xs:simpleType>

complexType

Схема: базовый элемент

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="age" type="xs:integer"/>
      </xs:sequence>    
    </xs:complexType>
  </xs:element>
</xs:schema>

Схема: с типам

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- описуем тип -->
    <xs:complexType name="pipel">
      <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="age" type="xs:integer"/>
      </xs:sequence>    
    </xs:complexType>
  <!-- Присваеваим тип эелементу -->
  <xs:element name="root" type="pipel"></xs:element>
</xs:schema>

XML:

<root>
  <name>Александр</name>
  <age>23</age>
</root>

Группы элементов

Группа позволяет описать общие элементы. (работает как include) Схема:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="persons">
    <xs:complexType>
      <xs:sequence>
 
        <xs:element name="client" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
 
              <xs:group ref="PersonaGroup" />
              <xs:element name="age" type="xs:int" />
 
            </xs:sequence>
          </xs:complexType>
        </xs:element>
 
        <xs:element name="clerk">
          <xs:complexType>
            <xs:sequence>
 
              <xs:group ref="PersonaGroup" />
              <xs:element name="many" type="xs:int" />
 
            </xs:sequence>
          </xs:complexType>
        </xs:element>
 
      </xs:sequence>
    </xs:complexType>
  </xs:element>
 
<xs:group name="PersonaGroup">
  <xs:sequence>
    <xs:element name="name" type="xs:string" />
    <xs:element name="date" type="xs:date" />
  </xs:sequence>
</xs:group>
 
</xs:schema>

XML:

<persons>
 
  <client>
    <name>Вася</name>
    <date>2010-03-21</date>
    <age>22</age>
  </client>
 
  <client>
    <name>Петя</name>
    <date>2010-01-29</date>
    <age>12</age>
  </client>
 
  <clerk>
    <name>Петя</name>
    <date>2010-01-29</date>
    <many>120000</many>
  </clerk>
</persons>

Расширение типов

Аналогична группам:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
 <xs:complexType name="testType" >
  <xs:sequence>
    <xs:element name="names" type="xs:string" />
    <xs:element name="date" type="xs:date" />
  </xs:sequence>
</xs:complexType>
 
 
  <xs:element name="persons">
    <xs:complexType>
      <xs:sequence>
 
        <xs:element name="client">
          <xs:complexType>
            <xs:complexContent>
              <xs:extension base="testType">
                <xs:sequence>
 
                 <xs:element name="age" type="xs:int" />
 
                </xs:sequence>
              </xs:extension>
            </xs:complexContent>
          </xs:complexType>
        </xs:element>       
 
 
        <xs:element name="clerk">
          <xs:complexType>
            <xs:complexContent>
              <xs:extension base="testType">
                <xs:sequence>
 
                  <xs:element name="many" type="xs:int" />
 
                </xs:sequence>
              </xs:extension>
            </xs:complexContent>
          </xs:complexType>
        </xs:element>
 
      </xs:sequence>
    </xs:complexType>
  </xs:element>
 
</xs:schema>

xml:

<persons>
 
  <client>
    <names>Вася</names>
    <date>2010-03-21</date>
    <age>22</age>
  </client>
 
  <clerk>
    <names>Петя</names>
    <date>2010-01-29</date>
    <many>120000</many>
  </clerk>
 
</persons>