XML Schema (XML схема) — описание структуры XML-документов

Logo
XML Schema (XML схема) - описание структуры XML-документов

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

Чтобы оценить преимущество XML схем (XML Schema) перед DTD, давайте более подробно рассмотрим основные недостатки DTD, которые с успехом были исправлены в XML схемах. О них я уже упоминал в статье «XML DTD», но для лучшего понимания давайте повторим.

Недостатки XML DTD перед XML Schema

  1. Отличный от XML синтаксис языка. То есть, DTD не является XML. В связи с этим могут возникать разнообразные проблемы с кодировкой и верификацией XML-документов.
  2. Нет проверки типов данных. В XML DTD существует лишь один тип данных – строка. В связи с этим, например, если в числовом поле будет текст, документ все равно пройдет верификацию, так как XML DTD не может проверить тип данных.
  3. Нельзя поставить в соответствие одному XML-документу больше одного DTD описания. То есть, верифицировать документ можно лишь одним DTD описанием. Если их несколько, то придется переделывать описания и совмещать все в одном файле, что очень неудобно.

Это были основные недостатки XML DTD, которые с успехом исправлены в промышленном стандарте описания XML-документов XML Schema.

XML Schema – промышленный стандарт описания XML-документов

Если быть кратким, то XML Schema делает следующее:

  1. Описывает названия элементов и атрибутов (словарь).
  2. Описывает взаимосвязь между элементами и атрибутами, а также их структуру (модель содержания).
  3. Описывает типы данных.

Также хочу заметить, что на данный момент при помощи схем можно описывать практически все. То есть, схема – это универсальный способ описания грамматики данных, который может применяться не только для верификации XML-документов, но и описания баз данных и т.д. Таким образом, область применения схем на данный момент очень широкая.

Пример XML Schema для валидации XML-документа

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

Пример простой схемы XML 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="книга" type="Книга" />
<xs:complexType name="Книга">
<xs:sequence>
<xs:element name="название" type="xs:string" />
<xs:element name="цена" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:schema>

При помощи данной схемы можно проверить XML-документ следующего содержания.

<книга xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "book.xsd">
<название>Основы XML</название>
<цена>300</цена>
</книга>

Итак, вернемся к нашей XML схеме. Как вы уже заметили, для создания XML схем используется уже известный нам XML. Единственное отличие здесь в том, что в XML Schema уже определены элементы, в отличие от обычного XML. В связи с этим используются пространства имен. В данном случае обязательным пространством имен будет «http://www.w3.org/2001/XMLSchema», которое будет задаваться при помощи префиксов «xs».

Сразу хочу заметить, что можно использовать как префиксы пространств имен, так и задавать пространство имен для корневого элемента. Как таковой разницы здесь нет. Каждый сам решает, как ему поступать в данной ситуации. Скажу только, что обычно используются префиксы «xs» или «xsd».

Ну а теперь давайте разберемся, как же расшифровать вышеприведенную схему. Как уже говорилось выше, XML Schema это описание словаря и типов данных. Отталкиваясь от этого, произведем расшифровку каждого элемента.

  • <xs:element name=»книга» type=»Книга» /> — объявляем элемент «книга» с типом «Книга».
  • <xs:complexType name=»Книга»> — объявляем комплексный тип с именем «Книга» (xs:complexType – может содержать в себе вложенные элементы).
  • <xs:sequence> — объявление вложенности. То есть, тип будет содержать вложенные элементы.
  • <xs:element name=»название» type=»xs:string» /> — объявляем элемент с именем «название» (стандартного типа «строка» — xs:string).
  • <xs:element name=»цена» type=»xs:decimal» /> — объявляем элемент с именем «цена» (стандартного типа «число» — xs:decimal).

Как видите, ничего сверхсложного здесь нет. Если вдуматься, то все очень просто.

Основные элементы XML Schema

Если быть кратким, то XML схему можно описать следующим образом.

<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:annotation>
<xsd:documentation>
Ваша схема
</xsd:documentation>
</xsd:annotation>
…
</xsd:schema>

Как видно с примера, каждая XML схема состоит с корневого элемента «schema» и обязательного пространства имен «http://www.w3.org/2001/XMLSchema». Далее идет описание схемы и собственно сама схема. При этом очень часто в очень качественных схемах описание бывает куда большим, чем сама XML Schema.

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

В начале статьи мы уже рассмотрели пример простейшей XML схемы. В ней мы отдельно описывали элементы и типы. При этом сразу хочу заметить, что последовательность здесь не играет роли. Схема будет работать в любом случае.

Теперь давайте рассмотрим второй способ написания 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:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

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

1 способ

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

2 способ

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

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

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

Как видите, пока все довольно просто. Опять же, углубляться во все подробности мы не будем, так как данная статья предназначена для ознакомления с XML Schema, а не ее детальным изучением.

Как ставится в соответствие XML Schema и документ

Особенностью XML Schema является то, что она описывает не сам документ, а пространство имен. В связи с этим чаще всего никаких упоминаний о ней в документе нет. Обработчик сам ставит в соответствие нужную вам схему без использования каких-либо инструкций в XML-документе.

На случай, если обработчик не знает где лежит схема, мы можем указать, где ее искать. Делается это при помощи специального атрибута «schemaLocation». Поскольку этот атрибут принадлежит другому пространству имен, то перед началом использования атрибута пространство тоже нужно указать. Для наглядности рассмотрим пример.

XML Schema

<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.site.com"
...

XML-документ

<?xml version="1.0" ?>
<my:product xmlns:my="http://www.site.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.site.com/product.xsd"
…

Теперь давайте подробно разберем каждую строчку.

  • targetNamespace=»http://www.site.com» – указываем для какого пространства имен эта XML Schema.
  • xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» – подключаем пространство имен в котором описан атрибут «schemaLocation».
  • xsi:schemaLocation=»http://www.site.com/product.xsd» – указываем, где можно найти схему на случай, если парсер не знает где она лежит. Если XML-документ не принадлежит никакому пространству имен, а следовательно и в схеме нет на него указания, то атрибут «schemaLocation» заменяется на «noNamespaceSchemaLocation» (указание на схему без определения пространств имен).

Рекомендую также ознакомиться с другими статьями по XML и XSLT:

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

На этом все. Удачи вам и успехов в изучении XML!

Обнаружили ошибку? Выделите ее и нажмите Ctrl+Enter

Комментарии 3

  • alexander

    Отличная серия статей! Все четко, кратко и по существу.

  • Женя

    Поправьте пожалуйства xs:sequAnce на xs:sequEnce в разделе "Описание элементов в XML Schema". А так — хорошая статья, все описано довольно доходчиво.

  • Дмитрий

    Опечатку исправил. Спасибо за внимательность:)

Оставить комментарий

отменить ответ