Для описания структуры документа кроме DTD можно использовать схему XML, которая имеет определенные преимущества в сравнении с DTD. Схема – это внешний файл, который содержит описание элементов и атрибутов XML – документа. Схемы используют синтаксис языка XML для определения элементов документа, их подчинение, типов данных элементов, при чем схемы поддерживают значительно большее количество типов данных чем DTD. Схемы, в отличие от DTD, также поддерживают пространства имен. Таким образом, после проверки на соответствие XML - документа схеме обрабатывающая программа может создать модель данных документа, которая включает:
§ словарь – названия элементов и атрибутов;
§ модель содержимого документа – структура документа, которая отображает отношение между элементами и атрибутами:
§ типы данных.
На настоящее время существуют два основных типа схем: XML – Data Reduced - стандарт, который используется фирмой Microsoft, и XML – Schema – стандарт W3C. Схемы стандарта XML – Data Reduced достаточно распространены, однако, на практике чаще работают со схемами стандарта корпорации W3C XML – Schema, поэтому данный инструмент работы по XML – документам будет рассматриваться на примере стандарта XML – Schema.
Создание схемы выполняется с помощью языка XML – схемы, которая по обыкновению называется языком определения XML – схемы XSD (XML Schema definition). Стандарт имеет статус рекомендации W3C с 2 мая 2001 года. Сейчас консорциумом разрабатывается новая версия 1.1 XML – Schema Definition Language (XSD).
XML – схема начинается с объявления XML – документа, дальше следует тег xsd:schema, который является тегом наивысшего уровня, который содержит в себе все элементы XML – схемы. Данный тег включает атрибуты, которые определяют пространства имен для схемы. По обыкновению тег schema включает атрибут
xmlns:xsd="http://www.w3.org/2001/Xmlschema"
Этот атрибут указывает на то, что элементы и типы данной схемы определяются в пространстве имен 2001 Xmlschema, которое можно найти по адресу http://www.w3.org/2001/XMLSchema. Атрибут xmlns имеет фиксированное значение, в данном случае его менять нельзя. Как префикс пространства имен можно использовать любую последовательность символов. По обыкновению используются префикс xsd в соответствии с согласованием относительно использования данного именного пространства для определения элементов XML – схемы.
Внутри тега schema описываются элементы XML – документа. Элементы, которые содержат элементы или атрибуты, называются элементами комплексного типа. Элементы, которые вмещают только собственные данные, называются элементами простого типа. Для описания элементов простого типа используется тег element, что имеет вид:
<xsd:element name="имя_элемента" type="тип_данных"/>
В XML – схемах чаще всего используются такие типы данных:
xsd:string | - любые символьные данные |
xsd:boolean | - логические значения true или false, 1 или 0 |
xsd:integer | - целое число |
xsd:float | - числовое значение |
xsd:date | - дата |
xsd:datetime | - дата и время |
Например, для описания элемента first_name можно в схеме определить:
<xsd:element name=" first_name " type="xsd:string"/>
Элементы комплексного типа могут быть описаны в схеме двумя образами:
I. Определяется имя элемента, комплексный тип данных для конкретного элемента и дальше описывается последовательность дочерних элементов.
Например, так можно описать элемент student, который имеет дочерние элементы name и birthday символьного типа данных.
<xsd:element name="student">
<xsd:complextype>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="birthday" type="xsd:string"/>
</xsd:sequence>
</xsd:complextype>
</xsd:element>
II. Объявляется элемент – определяется его имя и имя комплексного типа данных, а дальше в схеме описывается комплексный тип данных с данным именем.
Например, элемент student может быть описан так:
<xsd:element name="student" type="stdata" />
<xsd:complextype name="stdata" >
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="birthday" type="xsd:string"/>
</xsd:sequence>
</xsd:complextype>
Второй образ дает возможность использовать комплексный тип данных при объявлении нескольких элементов.
Для описания атрибутов элементов в схеме используется тег xsd:attribute, который может вмещать следующие атрибуты:
name - имя атрибуту элемента;
type – тип данных значения атрибуту;
default – значение по умолчанию;
fixed – фиксированное значение атрибуту;
use – характер использования атрибуту: required – атрибут есть обязательным, optional - необязательный атрибут.
Например, если простой элемент phone имеет атрибут kind, то это можно описать так:
<xsd:element name="phone" type="xsd:string">
<xsd:attribute name=" kind" type="xsd:string"/>
</xsd:element>
В схемах, как и в DTD, можно определить допустимое количество повторений для элементов документа – количество вложений. Это выполняется с помощью атрибутов minoccurs и maxoccurs тега xsd:element.
Атрибут minoccurs определяет минимальное количество появлений элемента в документе. Возможные значения атрибута:
0 – элемент есть необязательным, может появляться нуль или больше раз;
1 – элемент должен быть присутствующим минимум один раз (значение по умолчанию).
Атрибут maxoccurs определяет максимальное количество появлений элемента в документе. Возможные такие значения атрибуту:
1 – элемент может появляться в документе не больше одного раза;
unbounded – число появлений элемента в документе не ограниченно.
Схему XML – документа можно создать с помощью текстового редактора, в том числе программы Блокнот, или с использованием разных XML – редакторов. Файл, в котором хранится схема документа, должен иметь расширения xsd. Для того чтобы связать XML – документ со схемой, нужно в теге корневого элемента определить пространство имен схемы и определить внешний файл, в котором находится схема.
Например, XML - документ, в котором находятся данные о студентах и для которого создана схема, будет выглядеть так:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsd="http://www.w3.org/2001/Xmlschema-instance"
xsd:nonamespaceschemalocation="Schdoc1.xsd">
<student number="1">
<name><first_name>Иван</first_name>
<last_name>Петренко</last_name></name>
<birthday>8 декабря 1990 года</birthday></student>
<student number="2">
<name><first_name>Мария</first_name>
<last_name>Смирнова</last_name></name>
<birthday>20 июля 1989 года</birthday></student>
</students>
Схема этого документа:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/Xmlschema">
<xsd:element name="students" type="sts" />
<xsd:complextype name="sts" >
<xsd:sequence>
<xsd:element name="student" type="stdata" minoccurs="0" maxoccurs="unbounded" />
</xsd:sequence>
</xsd:complextype>
<xsd:complextype name="stdata" >
<xsd:sequence>
<xsd:element name="name" type="stname" />
<xsd:element name="birthday" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="number" type="xsd:string"/>
</xsd:complextype>
<xsd:complextype name="stname" >
<xsd:sequence>
<xsd:element name="first_name" type="xsd:string"/>
<xsd:element name="last_name" type="xsd:string"/>
</xsd:sequence>
</xsd:complextype>
</xsd:schema>
Для проверки соответствия документа схеме можно использовать разные программные средства – программы XML – Validator, некоторые из них предоставляют возможность проверить соответствие XML – документа схеме в режиме он-лайн. Например, по адресу http://xmltools.corefiling.com/schemaValidate можно обратиться к такой программе.
На web-странице в поле XML Schema нужно определить файл со схемой, в поле XML Instance – файл с XML – документом, нажать на кнопке Validate, дальше для вывода результатов проверки валидности нажать на ссылке Click here. Результаты проверки должны выглядеть как на рис. 10.4. В случае выявления ошибок программа выведет перечень причин, с которых документ не является валидным.
Рисунок 3 – Окно диалога программы проверки XML – документа на соответствие схеме