eXtensible Markup Language 3

eXtensible Markup Language

Начало в КГ №№ 27, 30

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

Спецификация XML Schema состоит из двух частей: Structures и Data Types. Первая описывает синтаксис для описания документов XML, а вторая задает правила описания типов данных, используемых в различных спецификациях XML (XML Schema, XSL, RDF). Обе спецификации связаны в единое целое.

XML Schema: Structures представляет нам набор правил для определения XML Schema для какого-либо XML-документа. Во-первых, все определения должны быть расположены внутри элемента <schema> </schema> . Здесь мы можем определять типы <type> </type>, элементы <element> </element>, атрибуты <attribute> </attribute> и многое другое. Из прочих средств можно выделить объявление типа и модели содержимого, группы атрибутов с общим именем, наследование типов, ссылки и пр. Дадим более точное определение некоторым средствам XML Schema:

Простое определение типа (Simple Type Definition) — определение символьных данных в значениях атрибутов и содержимого элементов.
Комплексное определение типа (Complex Type Definition) — набор ограничений для элемента. Используемые теги: <type> и </type> .
Объявление типа элемента (Element Type Definition) — связывает элемент с типом. Используемые теги: <element> и </element> .
Объявление атрибута (Attribute Declaration) — связывает имя атрибута с типом данных. Используемые теги: <attribute> и </attribute> .
Тип содержимого (Content Type) — тип или модель содержимого.
Элементная модель содержимого (Element Content Type) — тип, который определяет ограничения содержимого для элемента. Позволяет определить последовательность и группировку.
Определение группы атрибутов (Attribute Group Definition) — упрощение повторного использования атрибутов. Возможность объединить в группу атрибуты с одинаковыми именами.
Производное определение типа (Deriving Type Definition) — определение типа, производного от исходного типа. При этом соблюдаются все правила наследования (тип содержимого и атрибуты).
Ссылки на компоненты Schema через пространства имен (References to Schema Components Across Namespaces) — объединение определений и объявлений из любого места схемы.
Ограничения с использованием уникального ключа и ссылок на ключ (Unique Key and Key References Constraints) — определяют мощные средства организации ссылок между документами, а также уникальности.
В XML тип данных — это набор значений, характеризующийся свойствами этих значений и операций, которые можно проводить над ними. Типы данных можно разделить на несколько категорий: атомарные и агрегатные, базовые и производные, встроенные и пользовательские.
Атомарные типы данных — это такие типы данных, которые не подлежат дальнейшему разделению на подтипы. В свою очередь агрегатные могут быть разделены на две и более составляющих значения.
Базовыми называют типы, которые существуют сами по себе, а не определены на основе других типов. К ним относятся: boolean, integer, byte и пр. Производные типы можно определить с помощью базовых либо других производных типов данных.
Типы, которые были полностью определены в спецификации XML Schema: Datatypes, называются встроенными. К встроенным типам относятся как базовые, так и производные. Пользовательские типы определяются пользователем. На пользовательские типы можно накладывать ограничения при помощи средств XML Schema.
В спецификации XML Schema: Datatypes определено большое количество как базовых, так и производных типов. Перечислить их все в рамках этой статьи не представляется возможным. Поэтому, если вам интересно, перечень этих типов вы можете посмотреть в родном тексте спецификации по XML Schema. Я лишь ограничусь несколькими, на мой взгляд, наиболее интересными и незнакомыми типами данных для того, чтобы вы могли оценить предоставляемые вам возможности.

Тип данных — Описание
uriReference — Унифицированный идентификатор ресурсов
time — Время в виде строкового значения соответственно стандарту ISO 8601
date — Дата в виде строкового значения соответственно стандарту ISO 8601
time — Period Период времени согласно стандарту ISO 8601
timeInstant — Конкретный момент времени
timeDuration — Длительность времени согласно стандарту ISO 8601
string — Набор символов UCS указанной длины
boolean — Двоичное булевское значение
binary — Последовательность байт
language — Идентификатор естественного языка согласно RFC 1766

Как видно из таблицы, спецификация XML Schema: Datatypes содержит некоторое количество совершенно новых, предопределенных типов для работы со временем, датой, национальным языком и пр.
Рассмотрим простой пример документа XML Schema. Для начала определимся с XML-документом, для которого мы, собственно, и будем составлять XML Schema. Вот пример простого XML-документа:

<?xml version = "1.0"?>
<diskshelf>
<cd num = "1">
<name> Volume 1</name>
<desctiption> Диск Volume1</description>
</cd>
<cd num = "2">
<name> Volume 2</name>
<desctiption> Диск Volume2</description>
</cd>
<cd num = "3">
<name> Volume 3</name>
<desctiption> Диск Volume3</description>
</cd>
</diskshelf>

Этот достаточно простой пример описывает набор компакт-дисков, хранящихся на чьей-то полке. Пусть они называются Volume1, Volume2 и Volume3 соответственно. Теперь определим документ XML Schema для поддержания корректной структуры этого XML-документа.

<schema targetNameSpace = "http://www.litvinuke. hut.ru/diskshelf"
xmlns = "http://www.w3c.org/TR/1999/WD-xmlsche-ma-1-19991217"
xmlns:diskshelf = "http://www.litvinuke.hut.ru/diskshelf">
<element name = "diskshelf" type = "diskshelf_type" />

<type name = "diskshelf_type">
<element name = "cd" type = "cd_type" minOccurs = "1" maxOccurs = "*" />
</type>

<type name = "cd_type">
<element name = "name" type = "string" />
<element name = "description" type = "string" />
<attribute name = "num" type = "string" />
</type>
</schema>

В начале мы определяем атрибуты тега <schema> . С их помощью задаем используемые пространства имен. После этого внутри элемента <schema> </schema> поочередно описываем каждый элемент и его тип начиная с корневого. Однако это не значит, что по-другому делать нельзя. Вы можете определять элементы, их типы и атрибуты в любой последовательности.
Атрибуты элемента <element> </element> minOccurs и maxOccurs задают минимальное и максимальное вхождение этого элемента. В нашем случае должен существовать как минимум один элемент <cd> </cd> . Максимальное же количество вхождений не ограничено, о чем говорит символ *, заданный в качестве значения атрибута maxOccurs. По умолчанию значения этих атрибутов позволяют элементу лишь однократное вхождение себя внутри элемента предка.
Дальше, думаю, все понятно, и больше пояснений не требуется. Напомню лишь, что важно не забывать о регистре используемых символов. Имена типов выбираются произвольно и должны быть уникальными. Вот, кажется, и все. Знаний и умений, которые вы получили (а я надеюсь, что это так:)) от прочтения этой статьи, хватит для написания документов XML Schema для не очень сложных XML-документов. Если же полученной информации вам явно недостаточно, можете обратиться к спецификации XML Schema на сайте www.w3c.org.

Алексей Литвинюк


Компьютерная газета. Статья была опубликована в номере 38 за 2002 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета