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

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-схем:

  • Редакторы XMLOxygen 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 →