Простые и сложные типы
Модель XML-документа, описывающая его структуру и представленная на языке XML, называется XML-схемой.
XML-схема, как и DTD, предназначена для описаний структурных и семантических ограничений, которые должны выполняться в любом экземпляре данных, соответствующем этой модели. Характерным примером структурного ограничения для XML-документов является спецификация содержания элементов (например, элемент с именем А может содержать только элементы с именем В), а примером семантического ограничения — указание, что некоторый атрибут элемента является ключом.
В XML-схемах используют определения и объявления. С помощью определений задают новые типы элементов, а с помощью объявлений — имена и содержимое элементов и атрибутов.
Общий вид XML схемы:
<?xml version="1.0"?>
<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  ...
  ...
</xs:schema>
где xs ( часто используется xsd) — псевдоним пространства имен http://www.w3.org/2001/XMLSchema.
Различают комплексные (сложные) типы элементов, которые могут иметь вложенные элементы и атрибуты, и простые типы, которые таковых не имеют.
Элементы объявляются с помощью оператора element. Простой элемент xs:element имеет имя (name) и тип (type). Возможны также ограничения (xs:restriction), помещаемые в контейнер <xs:simpleType>...</xs:simpleType>. Пример определения простого элемента:
<xs:element name="device" type="xs:string"/>
Комплексные типы определяются с помощью оператора complexType, в определениях обычно содержится набор из объявлений элементов, ссылок на элементы и объявлений атрибутов. Структура определения сложного типа видна из следующего примера:
<xs:element name="worker">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:element name="DateofBirth" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
В контейнере <xs:sequence>...</xs:sequence> перечисляются вложенные элементы.
Атрибуты
Сложные элементы могут иметь атрибуты (xs:attribute). Атрибуты объявляются с помощью оператора attribute:
<xs:attribute name="xxx" type="yyy"/>
Простые типы определяются в данном документе или являются встроенными в язык XML-схемы. К встроенным относятся string, integer, decimal, float, date (например, 2005-06-26), boolean, time и ряд других.
Атрибут может быть объявлен с параметром use, значениями use могут быть use="required" (обязателен), use="optional" (необязателен), или use="prohibited" (запрещен). Атрибут fixed используется для указания, что атрибут или элемент может принимать только фиксированное значение. Атрибут ref является ссылкой на ранее объявленный элемент, например <xsd:element ref="item"/>. Возможно указание значения элемента или атрибута (параметры default или fixed). Например:
<xs:element name="color" type="xs:string" default="red"/>
<xs:element name="color" type="xs:string" fixed="red"/>
<xs:attribute name="lang" type="xs:string" use="required"/>
Ограничения
На значения элементов и атрибутов могут накладываться ограничения, называемые фасетами. Объявления обычно связывают имена элементов и ограничения. В следующем примере элемент "month" имеет тип "integer" в ограниченном диапазоне от 1 до 12:
<xs:element name="month">
<xs:simpleType>
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="1"/>
    <xs:maxInclusive value="12"/>
  </xs:restriction>
</xs:simpleType>
</xs:element>
Если допустимыми являются отдельные значения, то используются ограничения enumeration:
<xs:element name="student">
<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:enumeration value="Ivanov"/>
    <xs:enumeration value="Petrov"/>
    <xs:enumeration value="Komarov"/>
  </xs:restriction>
</xs:simpleType>
</xs:element>
Допустима также следующая форма записи последнего примера:
<xs:element name="student" type="team"/>
<xs:simpleType name="team">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Ivanov"/>
    <xs:enumeration value="Petrov"/>
    <xs:enumeration value="Komarov"/>
  </xs:restriction>
</xs:simpleType>
В этом случае тип "team" доступен для использования также и в других элементах, т.е. эта форма фактически является определением нового типа "team".
К числу ограничений для типа xs:string относятся также парамтеры length (число символов или элементов списка), maxLength (максимальное число символов или элементов списка), pattern (диапазон, в котором может находиться символ), totalDigits (число цифр) и др. Можно накладывать ограничения на число вхождений элементов в комплексный тип с помощью атрибутов minOccurs и maxOccurs, например, minOccurs='0' означает, что минимальное число вхождений элемента в документ равно нулю (аналогично указанию ? в DTD), т.е. в данном случае необязательность вхождения элемента, а maxOccurs='4' говорит о том, что элемент может входить не более четырех раз.
Пример
На рис. 1 представлен пример модели документа, соответствующей спецификации DOM.
Рис. 1.  Пример модели документа
Та же модель в виде XML-схемы (с добавлением атрибута price для элемента book):
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
.  .  .
     <xsd:element name="book">
     <xsd:complexType>
       <xsd:sequence>
          <xsd:element name="author" type="xsd:string"/>
          <xsd:element name="title" type="xsd:string"/>
          <xsd:element name="publisher" type="xsd:string"/>
          <xsd:element name="year" type="xsd:integer"/>
       </xsd:sequence>
       <xsd:attribute name="price" type="xsd:decimal"/>
     </xsd:complexType>
    </xsd:element>
.  .  .
</xsd:schema>
Как видно из примера, перечисление вложенных элементов производится в контейнере sequence.
В XML-документах, соответствующих этой XML-схеме, в описании каждой книги должны присутствовать значения элементов автор, название, издательство и год издания в том порядке, в каком они заданы в схеме:
<book price=124>
  <author>Bibilo</author>
  <title>VHDL Basics</title>
  <publisher>Solon-R</publisher>
  <year>2000</year>
</book>
Расширения
В следующем примере описываются два класса ТВ и ТА, находящиеся в отношении родитель (В) — потомок (А). Класс ТВ характеризуется свойствами par1 и par2. Класс ТА наследует свойства класса ТВ и имеет дополнительно свойства par3-par5. Все свойства относятся к типу string. Элемент А является объектом класса ТА.
<xs:element name="A" type="TA"/>
<xs:complexType name="TB">
  <xs:sequence>
    <xs:element name="par1" type="xs:string"/>
    <xs:element name="par2" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="TA">
  <xs:complexContent>
    <xs:extension base="TB">
      <xs:sequence>
        <xs:element name="par3" type="xs:string"/>
        <xs:element name="par4" type="xs:string"/>
        <xs:element name="par5" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
Ссылка на родительский класс выполняется с помощью тега <xs:extension base="имя родительского класса">, помещаемого вместе с <xs:sequence>...</xs:sequence> в контейнер <xs:complexContent>...</xs:complexContent>.
Если классы ТВ и ТА находятся в отношении "целое-часть", то при описании части (ТА) вместо
<xs:extension base="TB">
нужно использовать
<xs:restriction base="ТВ">
В отличие от xs:complexContent контейнер <xs:simpleContent>...</xs:simpleContent> может содержать только текст или атрибуты.
Индикаторы
Для описания порядка, в каком элементы могут появляться в XML-документе, служат различные индикаторы. Например, индикатор "all" указывает на произвольный порядок перечисления элементов:
<xs:element name="B" type="TB"/>
  <xs:complexType name="TB">
    <xs:all>
      <xs:element name="par1" type="xs:string"/>
      <xs:element name="par2" type="xs:string"/>
    </xs:all>
  </xs:complexType>
Использование <xs:choice> вместо <xs:all> означает, что в XML-документе должен присутствовать один из перечисленных элементов.
Из элементов можно образовывать группы и затем многократно использовать их в разных частях модели, ссылаясь на них с помощью параметра ref:
<xs:group name="B">
  <xs:sequence>
    <xs:element name="par1" type="xs:string"/>
    <xs:element name="par2" type="xs:string"/>
  </xs:sequence>
</xs:group>
<xs:element name="A" type="TA"/>
<xs:complexType name="TA">
  <xs:sequence>
    <xs:group ref="B"/>
    <xs:element name="par3" type="xs:string"/>
    <xs:element name="par4" type="xs:string"/>
    <xs:element name="par5" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
То же можно делать с атрибутами, объединяя их в группы с помощью тега <xs:attributeGroup name="...">.
Ссылки на XML-схемы
В XML-документе требуется ссылка на соответствующую документу схему. Например, ссылка на XML-схему, размещенную в файле по адресу http://www.bibl.ru/Books.xsd", в XML-документе Reference может быть выполнена с помощью указания используемого пространства имен (http://www.bibl.ru/Books) и атрибута SchemaLocation следующим образом:
<Reference
   xmlns="http://www.bibl.ru/Books"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.bibl.ru/Books
   http://www.bibl.ru/Books.xsd">
 . . .
 . . .
</Reference>