XML Schema
XML Schema — это язык описания структуры и ограничений для XML-документов, определённый консорциумом W3C (World Wide Web Consortium) в качестве рекомендации в 2001 году. XML Schema (часто обозначается как XSD, от XML Schema Definition) задаёт допустимые элементы, атрибуты, типы данных, порядок и вложенность компонентов, а также правила проверки корректности XML-документов. В отличие от DTD (Document Type Definition), XML Schema использует синтаксис XML, поддерживает пространства имён, богатую систему типов данных и возможность создания пользовательских типов.
История
Предшественником XML Schema был язык DTD, который использовался для описания структуры SGML и XML-документов с 1980-х годов. DTD имел ряд ограничений: собственный синтаксис, отсутствие поддержки пространств имён, ограниченные типы данных (только строки, перечисления и простые типы). В 1999 году W3C сформировал рабочую группу для создания более мощного и гибкого языка. Результатом стали две рекомендации:
- XML Schema Part 1: Structures (описывает определение элементов, атрибутов, групп моделей);
- XML Schema Part 2: Datatypes (определяет простые типы данных).
Первая версия была опубликована 2 мая 2001 года. Вторая версия (XSD 1.1) вышла 5 апреля 2012 года, добавив поддержку условных ограничений (assertions), типов замены (type substitution) и правил разрешения конфликтов.
Структура XML Schema
XML Schema представляет собой XML-документ с корневым элементом <xs:schema> (префикс xs обычно используется для пространства имён http://www.w3.org/2001/XMLSchema`). Схема состоит из:
- Определений глобальных элементов (
<xs:element name="..."/>) — элементы, доступные на верхнем уровне. - Определений глобальных атрибутов (
<xs:attribute name="..."/>). - Определений типов:
- Простые типы (
<xs:simpleType>) — на основе встроенных типов с ограничениями. - Сложные типы (
<xs:complexType>) — описывают структуру элементов с вложенными элементами и атрибутами. - Определений групп (
<xs:group>,<xs:attributeGroup>) — для переиспользования наборов элементов или атрибутов.
Пространство имён
XML Schema поддерживает привязку к целевому пространству имён (атрибут targetNamespace). Элементы и атрибуты, определённые в схеме, считаются принадлежащими этому пространству имён, если не указано иное. Это позволяет изолировать схемы разных организаций и избегать конфликтов имён.
Типы данных
XML Schema предоставляет обширную библиотеку встроенных типов, включая:
- Строковые:
string,normalizedString,token. - Числовые:
decimal,integer,positiveInteger,negativeInteger,nonNegativeInteger,nonPositiveInteger,long,int,short,byte,float,double. - Даты и время:
dateTime,date,time,gYear,gYearMonth,gMonthDay,gDay,gMonth. - Логический:
boolean. - Бинарные:
base64Binary,hexBinary. - URI и другие:
anyURI,QName,NOTATION.
На основе встроенных типов можно создавать простые типы с помощью ограничений (<xs:restriction>), например:
- Длина строки (
maxLength,minLength,length). - Диапазон чисел (
maxInclusive,minInclusive,maxExclusive,minExclusive). - Регулярные выражения (
pattern). - Перечисление (
<xs:enumeration value="..."/>). - Пробельные нормализации (
whiteSpace).
Пример:
``xml <xs:simpleType name="RussianPostalCode"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType> ``
Сложные типы
Сложные типы описывают элементы, содержащие вложенные элементы и/или атрибуты. Они делятся на:
- Содержащие только элементы (complex content) — элемент может содержать дочерние элементы, задаётся через модель содержимого (
sequence,choice,all,group). - Содержащие только текст (simple content) — элемент может содержать только текст (или смешанное содержимое), но с атрибутами. Используется наследование от простого типа (
<xs:extension base="...">). - Смешанное содержимое (mixed="true") — допускается текст между дочерними элементами.
Пример сложного типа:
``xml <xs:complexType name="PersonType"> <xs:sequence> <xs:element name="firstName" type="xs:string"/> <xs:element name="lastName" type="xs:string"/> <xs:element name="birthDate" type="xs:date" minOccurs="0"/> </xs:sequence> <xs:attribute name="id" type="xs:ID" use="required"/> </xs:complexType> ``
Модели содержимого
Для задания порядка и кратности дочерних элементов используются индикаторы:
<xs:sequence>— элементы должны следовать в заданном порядке.<xs:choice>— ровно один из перечисленных элементов.<xs:all>— все элементы могут появиться в любом порядке (но каждый не более одного раза, ограничения на вложенность).<xs:group>— ссылка на предопределённую группу элементов.
Кратность задаётся атрибутами minOccurs и maxOccurs (по умолчанию 1). Для неограниченного количества используется maxOccurs="unbounded".
Использование пространств имён в XML Schema
При определении элементов и атрибутов, принадлежащих к целевому пространству имён, в документе XML они должны быть квалифицированы (например, <ns:person>). В схеме это задаётся атрибутами elementFormDefault="qualified" и attributeFormDefault="qualified". Если значение unqualified, локальные элементы (не на верхнем уровне) не требуют квалификации.
Валидация XML-документов
Процесс проверки XML-документа на соответствие схеме называется валидация. Схема может быть подключена к XML-документу через атрибут xsi:schemaLocation (или xsi:noNamespaceSchemaLocation для безымянных схем). Большинство XML-парсеров (например, Xerces, libxml2, Saxon) поддерживают XSD-валидацию. Если документ не соответствует схеме, парсер выдаёт ошибку (или предупреждение в зависимости от настроек).
Основные отличия от DTD
| Характеристика | DTD | XML Schema (XSD) |
|---|---|---|
| Синтаксис | Собственный (не XML) | XML |
| Типы данных | Только строки, перечисления | Развитая система типов (числа, даты) |
| Пространства имён | Не поддерживает | Полноценная поддержка |
| Расширяемость | Ограниченная | Возможность наследования и замены типов |
| Количество типов | Ограниченное | 40+ встроенных типов |
| Структуризация | Плоская (глобальные элементы) | Иерархическая (локальные определения) |
| Документация | Нет | <xs:annotation> и <xs:documentation> |
Пример XML Schema
Ниже приведён пример схемы для описания каталога книг:
```xml <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/books" elementFormDefault="qualified">
<xs:element name="catalog"> <xs:complexType> <xs:sequence> <xs:element name="book" type="BookType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element>
<xs:complexType name="BookType"> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string" maxOccurs="unbounded"/> <xs:element name="year" type="xs:gYear"/> <xs:element name="price" type="xs:decimal" minOccurs="0"/> </xs:sequence> <xs:attribute name="isbn" type="xs:string" use="required"/> </xs:complexType>
</xs:schema> ```
Критика и ограничения
Несмотря на широкое распространение, XML Schema имеет ряд недостатков:
- Громоздкость — описание даже простой структуры требует много кода.
- Сложность — мощные возможности (например, ключи, ссылки, наследование) трудно осваиваются.
- Плохая поддержка контекстно-зависимых правил — проверки на основе значений других элементов (cross-field validation) в XSD 1.0 затруднены; в XSD 1.1 появились assertions, но они не всегда удобны.
- Отсутствие обработчиков — XSD не позволяет задавать действия при успешной/неуспешной валидации.
- Альтернативы — для упрощения часто используются Relax NG (компактный синтаксис) и Schematron (правила на основе XPath). В веб-разработке всё чаще предпочитают JSON Schema для JSON.
Применение
XML Schema широко используется в:
- Электронном документообороте (например, форматы ФНС России для отчётности).
- Сервисах SOAP и WSDL (определение структуры сообщений).
- Промышленных стандартах (eBXML, UBL, HL7, FpML).
- Базах данных (XML-базы данных, Oracle XML DB, SQL Server).
- Конфигурационных файлах (например, Maven pom.xml).
Интересные факты
- Термин «XML Schema» часто путают с «XSD»; официально W3C называет язык XML Schema, а файлы — XSD.
- В русскоязычной литературе встречается вариант «XML-схема» (через дефис), но в технической документации чаще используется «XML Schema».
- Разработка XSD 1.2 не планируется; W3C сосредоточился на поддержке существующей версии и смежных технологиях (XSLT, XPath).
Источники
- W3C XML Schema Recommendation (2001). XML Schema Part 1: Structures и XML Schema Part 2: Datatypes.
- W3C XML Schema 1.1 Recommendation (2012). XML Schema Definition Language (XSD) 1.1.
- Книга: "XML Schema" by Eric van der Vlist (O'Reilly Media, 2002).
- Книга: "XML in a Nutshell" by Elliotte Rusty Harold и W. Scott Means (O'Reilly Media, 2004).
- ГОСТ Р ИСО/МЭК 19757-2-2010: «Информационная технология. Схемы документов. Часть 2. Правила регулярной грамматики на основе XML (RELAX NG)».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →