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

RELAX NG

RELAX NG (от англ. Regular Language for XML Next Generation — «регулярный язык для XML следующего поколения») — это язык описания структуры XML-документов (схема), основанный на теории регулярных выражений и предназначенный для валидации XML-данных. RELAX NG определяет набор правил, которым должен соответствовать XML-документ, включая допустимые элементы, атрибуты, их типы, вложенность и порядок следования. В отличие от альтернативных языков схем, таких как DTD и XML Schema (W3C), RELAX NG отличается более простой и математически строгой моделью, основанной на регулярных грамматиках, а также поддержкой как XML-синтаксиса, так и компактного не-XML-синтаксиса.

История

RELAX NG был разработан как результат объединения двух предшествующих проектов: RELAX (REgular LAnguage for XML), созданного японским комитетом по стандартизации (JIS) под руководством Макото Мураты, и TREX (Tree Regular Expressions for XML), разработанного Джеймсом Кларком. В 2001 году эти проекты были объединены в рамках работы комитета OASIS (Organization for the Advancement of Structured Information Standards), и в том же году RELAX NG стал стандартом ISO/IEC 19757-2 (часть семейства стандартов Document Schema Definition Languages, DSDL). Версия 1.0 была утверждена в 2002 году, а версия 1.1 — в 2008 году.

RELAX NG не получил такого широкого распространения, как XML Schema (W3C), отчасти из-за меньшей маркетинговой поддержки со стороны крупных вендоров и отсутствия встроенной поддержки в некоторых популярных инструментах. Тем не менее, он используется в ряде проектов с открытым исходным кодом, в частности, в офисных форматах OpenDocument (ODF), в формате DocBook, а также в некоторых конфигурационных файлах и протоколах.

Основные принципы и синтаксис

Модель регулярных грамматик

RELAX NG основан на концепции регулярных грамматик для деревьев. Это означает, что схема описывает множество допустимых XML-документов с помощью набора правил, аналогичных регулярным выражениям, но для иерархических структур. Каждый элемент описывается через его содержимое — последовательность дочерних элементов, текстовых узлов и атрибутов, которые могут повторяться, быть необязательными или альтернативными.

Два синтаксиса

RELAX NG поддерживает два синтаксиса:

Ключевые элементы XML-синтаксиса

Схема в XML-синтаксисе строится из следующих основных конструкций:

  • <element name="..."> — определяет элемент с заданным именем.
  • <attribute name="..."> — определяет атрибут с заданным именем.
  • <text/> — указывает, что элемент или атрибут может содержать произвольный текст.
  • <empty/> — указывает, что элемент не должен содержать дочерних узлов.
  • <ref name="..."/> — ссылка на другой именованный шаблон (pattern), определённый с помощью <define>.
  • <define name="..."> — определяет именованный шаблон, который может быть многократно использован.
  • <zeroOrMore> — повторение шаблона ноль или более раз.
  • <oneOrMore> — повторение шаблона один или более раз.
  • <optional> — шаблон может присутствовать или отсутствовать.
  • <choice> — выбор одного из нескольких шаблонов (альтернатива).
  • <interleave> — указание, что дочерние элементы могут следовать в произвольном порядке (перемежение).
  • <group> — последовательность дочерних элементов (по умолчанию).
  • <data type="..."> — ограничение на тип данных (например, integer, string, date), обычно с использованием встроенных типов из XML Schema Part 2 или пользовательских типов.

Пример схемы в XML-синтаксисе

``xml <?xml version="1.0" encoding="UTF-8"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0">; <start> <element name="person"> <attribute name="id"><data type="integer"/></attribute> <element name="name"><text/></element> <optional> <element name="age"><data type="integer"/></element> </optional> <zeroOrMore> <element name="email"><text/></element> </zeroOrMore> </element> </start> </grammar> ``

Пример схемы в компактном синтаксисе

``relaxng start = element person { attribute id { xsd:integer }, element name { text }, element age { xsd:integer }?, element email { text }* } ``

Типы данных

RELAX NG не определяет собственных типов данных, а использует библиотеку типов из других спецификаций, чаще всего из XML Schema Part 2 (W3C). Для этого применяется элемент <data type="..."> с указанием пространства имён, например, xsd:string, xsd:integer, xsd:date. Также можно определять собственные типы с помощью шаблонов.

Отличия от других языков схем

RELAX NG vs. DTD

  • Синтаксис: DTD использует собственный не-XML-синтаксис, RELAX NG — XML или компактный.
  • Типы данных: DTD не поддерживает типы данных (все данные — строки), RELAX NG — поддерживает через внешние библиотеки.
  • Пространства имён: RELAX NG имеет встроенную поддержку пространств имён XML, DTD — нет (требует специальных атрибутов).
  • Регулярные грамматики: RELAX NG основан на регулярных грамматиках, что обеспечивает более строгую и предсказуемую модель валидации.

RELAX NG vs. XML Schema (W3C)

  • Сложность: XML Schema (W3C) значительно сложнее и объёмнее (около 200 страниц спецификации), RELAX NG — проще (около 50 страниц).
  • Модель: XML Schema (W3C) использует модель типов (type-based), RELAX NG — модель грамматик (pattern-based).
  • Процессор: Валидация по RELAX NG обычно быстрее и менее ресурсоёмка, чем по XML Schema (W3C).
  • Расширяемость: XML Schema (W3C) поддерживает наследование типов, переопределение и подстановку элементов, что делает его более гибким для сложных иерархий. RELAX NG не имеет этих механизмов, но их можно эмулировать с помощью шаблонов.
  • Поддержка: XML Schema (W3C) имеет более широкую поддержку в коммерческом и корпоративном ПО, RELAX NG — в основном в открытых проектах.

Применение

RELAX NG используется в следующих областях:

  • Форматы документов: OpenDocument (ODF), DocBook (начиная с версии 5.0), TEI (Text Encoding Initiative).
  • Конфигурационные файлы: некоторые проекты, например, Apache Ant, используют RELAX NG для описания своих конфигураций.
  • Протоколы: некоторые протоколы на основе XML (например, XMPP) используют RELAX NG для описания структур сообщений.
  • Инструменты: многие валидаторы XML (например, jing, rnv) поддерживают RELAX NG. Библиотеки для работы с RELAX NG доступны для различных языков программирования (Java, Python, C, C++).

Инструменты

  • Jing — популярный валидатор RELAX NG с открытым исходным кодом, написанный на Java Джеймсом Кларком.
  • rnv — валидатор, написанный на C, поддерживающий оба синтаксиса.
  • Trang — конвертер между различными языками схем (DTD, XML Schema, RELAX NG).
  • RELAX NG Validator — встроенный валидатор в некоторых XML-редакторах (например, oXygen XML Editor).

Критика

Основные критические замечания в адрес RELAX NG:

  • Отсутствие поддержки типов данных «из коробки» — необходимость полагаться на внешние библиотеки типов усложняет использование.
  • Ограниченная поддержка в коммерческом ПО — многие корпоративные инструменты и базы данных не поддерживают RELAX NG, отдавая предпочтение XML Schema (W3C).
  • Меньшее сообщество — по сравнению с XML Schema (W3C), сообщество разработчиков и пользователей RELAX NG значительно меньше, что сказывается на доступности ресурсов, документации и примеров.
  • Отсутствие механизмов наследования — для сложных систем с глубокой иерархией типов RELAX NG может быть менее удобен, чем XML Schema (W3C).

Источники

  1. James Clark, Makoto Murata. RELAX NG Specification. OASIS, 2001.
  2. ISO/IEC 19757-2:2008. Information technology — Document Schema Definition Languages (DSDL) — Part 2: Regular-grammar-based validation — RELAX NG.
  3. Eric van der Vlist. RELAX NG. O'Reilly Media, 2003.
  4. Документация проекта jing и trang (GitHub).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →