XML Schema Definition
XML Schema Definition (XSD) — это язык описания структуры и ограничений для содержимого XML-документов, основанный на синтаксисе XML. XSD определяет, какие элементы и атрибуты могут присутствовать в документе, их типы данных, порядок следования, количество вхождений и другие правила валидации. Разработан консорциумом World Wide Web Consortium (W3C) и является более мощной и гибкой альтернативой более ранним языкам, таким как DTD (Document Type Definition). XSD широко используется для обеспечения целостности данных, обмена информацией между системами и автоматической проверки XML-документов.
История и развитие
Первая версия спецификации XSD (XML Schema 1.0) была рекомендована W3C в мае 2001 года. До этого основным способом описания структуры XML был DTD, который имел ряд ограничений: собственный синтаксис, отличный от XML, ограниченную поддержку типов данных (только строки, перечисления и комбинации) и невозможность описания пространств имён. XSD был призван устранить эти недостатки, предоставив разработчикам возможность создавать строгие схемы с богатой типизацией, поддержкой наследования и модульности.
В 2004 году вышла вторая редакция XSD 1.0, исправлявшая ошибки и уточнявшая некоторые аспекты. В 2012 году W3C опубликовал рекомендацию XML Schema Definition Language (XSD) 1.1, которая добавила ряд новых возможностей, включая условные ограничения (assertions), поддержку открытых типов (open content) и улучшенную обработку версионирования. XSD 1.1 является обратно совместимым с XSD 1.0, но не все инструменты и библиотеки полностью его поддерживают.
Основные компоненты XSD
XSD-схема представляет собой XML-документ с корневым элементом <xs:schema> (или <xsd:schema>), в котором объявляются пространства имён, целевое пространство имён и другие глобальные настройки.
Определение элементов и атрибутов
Элементы объявляются с помощью тега <xs:element>, атрибуты — с помощью <xs:attribute>. Для каждого элемента или атрибута указывается имя (name) и тип данных (type). Тип может быть как встроенным (например, xs:string, xs:integer, xs:date), так и пользовательским, определённым в схеме.
Пример простого элемента: ``xml <xs:element name="name" type="xs:string"/> ``
Простые типы данных
XSD включает более 40 встроенных простых типов, разделённых на категории: строковые (string, normalizedString, token), числовые (decimal, integer, positiveInteger, float, double), дата/время (date, time, dateTime, gYear), логические (boolean), двоичные (base64Binary, hexBinary) и другие. Пользователь может создавать собственные простые типы, ограничивая существующие с помощью фацетов (facet) — правил, задающих допустимые значения. Основные фацеты:
minLength/maxLength— минимальная/максимальная длина строки.minInclusive/maxInclusive— минимальное/максимальное числовое значение (включая границы).minExclusive/maxExclusive— минимальное/максимальное числовое значение (исключая границы).pattern— регулярное выражение для проверки строки.enumeration— список допустимых значений.totalDigits/fractionDigits— общее количество цифр и количество цифр после запятой.
Пример пользовательского типа с ограничением: ``xml <xs:simpleType name="age"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="150"/> </xs:restriction> </xs:simpleType> ``
Сложные типы данных
Сложные типы (complexType) описывают элементы, которые могут содержать вложенные элементы, атрибуты или смешанное содержимое (текст с элементами). Сложные типы определяются с помощью тега <xs:complexType> и могут быть:
- Анонимными — определёнными непосредственно внутри элемента.
- Именованными — глобальными, которые можно переиспользовать в нескольких элементах.
Содержимое сложного типа задаётся с помощью композиторов:
sequence— элементы должны следовать в заданном порядке.choice— может быть выбран только один из перечисленных элементов.all— все элементы могут появляться в любом порядке (но не более одного раза каждый).
Для каждого элемента можно указать атрибут minOccurs (минимальное количество вхождений, по умолчанию 1) и maxOccurs (максимальное, по умолчанию 1; значение unbounded означает неограниченное количество).
Пример сложного типа: ``xml <xs:complexType name="person"> <xs:sequence> <xs:element name="firstName" type="xs:string"/> <xs:element name="lastName" type="xs:string"/> <xs:element name="age" type="age" minOccurs="0"/> </xs:sequence> <xs:attribute name="id" type="xs:ID" use="required"/> </xs:complexType> ``
Атрибуты
Атрибуты объявляются внутри сложного типа. Для каждого атрибута можно задать:
use— обязательность:required(обязательный),optional(необязательный),prohibited(запрещённый).default— значение по умолчанию, если атрибут не указан.fixed— фиксированное значение, которое не может быть изменено.
Пространства имён и целевое пространство имён
XSD поддерживает пространства имён XML. Атрибут targetNamespace корневого элемента <xs:schema> задаёт пространство имён, к которому относятся все элементы и типы, определённые в схеме. Для ссылок на другие схемы используется атрибут xmlns:xs (или другой префикс) для стандартного пространства имён XSD. Импорт внешних схем осуществляется с помощью элементов <xs:import> (для разных пространств имён) и <xs:include> (для того же пространства имён).
Нововведения XSD 1.1
Версия XSD 1.1, опубликованная в 2012 году, добавила несколько важных возможностей:
- Условные ограничения (assertions) — элементы
<xs:assert>и<xs:assertion>, позволяющие задавать произвольные XPath-выражения для проверки целостности данных. Например, можно проверить, что дата начала меньше даты окончания. - Открытое содержимое (open content) — позволяет разрешить или запретить появление в документе элементов, не описанных в схеме, с помощью атрибута
anyв<xs:openContent>. - Типизация по умолчанию — возможность задать тип для всех элементов без явного указания.
- Улучшенная обработка версий — атрибут
vc:minVersionиvc:maxVersionдля указания версий схемы.
Применение XSD
XSD используется в самых разных областях, где требуется формальная валидация XML-данных:
- Веб-сервисы — WSDL-документы (Web Services Description Language) часто используют XSD для описания типов данных, передаваемых в SOAP-сообщениях.
- Конфигурационные файлы — многие приложения (например, веб-серверы, IDE) используют XSD для валидации XML-конфигураций.
- Обмен данными — стандарты, такие как UBL (Universal Business Language) или OASIS, основаны на XSD для обеспечения единообразия документов.
- Базы данных — некоторые СУБД (например, Oracle, PostgreSQL) поддерживают хранение и валидацию XML-данных на основе XSD.
- Документооборот — форматы электронных документов (например, счета-фактуры в России, формат ФНС) часто описываются XSD-схемами.
Инструменты для работы с XSD
Существует множество инструментов для создания, редактирования и валидации XSD-схем:
- Редакторы XML — Oxygen XML Editor, XMLSpy, Visual Studio Code (с расширениями), IntelliJ IDEA.
- Библиотеки программирования — Java (JAXB, Xerces), .NET (XmlSchemaSet), Python (lxml, xmlschema), C++ (libxml2).
- Онлайн-валидаторы — бесплатные сервисы, позволяющие проверить XML-документ на соответствие XSD-схеме.
- Генераторы кода — инструменты, автоматически создающие классы на языках программирования (Java, C#, Python) на основе XSD-схемы (например, JAXB, xsd2code).
Критика и ограничения
Несмотря на широкое распространение, XSD имеет ряд критических замечаний:
- Сложность — синтаксис XSD громоздок и труден для чтения и ручного написания по сравнению с DTD или альтернативными языками, такими как Relax NG.
- Избыточность — для простых схем требуется много кода.
- Ограниченная выразительность — XSD не поддерживает такие конструкции, как проверка уникальности на основе нескольких полей (без использования XPath), или сложные зависимости между элементами.
- Проблемы с версионированием — обратная совместимость между XSD 1.0 и 1.1 не всегда идеальна, и не все инструменты поддерживают новую версию.
- Производительность — валидация больших документов может быть ресурсоёмкой.
Альтернативы
Основными альтернативами XSD являются:
- DTD (Document Type Definition) — более старый и простой язык, встроенный в спецификацию XML. Менее выразителен, не поддерживает типы данных и пространства имён.
- Relax NG — более простой и выразительный язык, также основанный на XML или компактном синтаксисе. Поддерживается некоторыми инструментами, но менее распространён, чем XSD.
- Schematron — язык проверки правил на основе XPath, позволяющий задавать произвольные условия. Часто используется в комбинации с XSD для дополнительной валидации.
- JSON Schema — аналог XSD для JSON, набирающий популярность в веб-разработке.
Источники
- World Wide Web Consortium. XML Schema Definition Language (XSD) 1.1. W3C Recommendation, 2012.
- World Wide Web Consortium. XML Schema Part 0: Primer. W3C Recommendation, 2001.
- Harold, E. R., & Means, W. S. XML in a Nutshell. O'Reilly Media, 2004.
- Walmsley, P. Definitive XML Schema. Prentice Hall, 2001.
- Материалы сайта W3Schools (раздел XML Schema).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →