Открыть сервис

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 сформировал рабочую группу для создания более мощного и гибкого языка. Результатом стали две рекомендации:

Первая версия была опубликована 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

ХарактеристикаDTDXML 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 →