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-синтаксис (RELAX NG XML). Схема записывается в виде XML-документа с использованием специальных элементов из пространства имён
http://relaxng.org/ns/structure/1.0`. Этот синтаксис наиболее привычен для разработчиков, работающих с XML. - Компактный синтаксис (RELAX NG Compact). Разработан Джеймсом Кларком для упрощения создания и чтения схем. Он не является XML и использует более лаконичный синтаксис, напоминающий языки программирования. Компактный синтаксис легко преобразуется в XML-синтаксис и обратно.
Ключевые элементы 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).
Источники
- James Clark, Makoto Murata. RELAX NG Specification. OASIS, 2001.
- ISO/IEC 19757-2:2008. Information technology — Document Schema Definition Languages (DSDL) — Part 2: Regular-grammar-based validation — RELAX NG.
- Eric van der Vlist. RELAX NG. O'Reilly Media, 2003.
- Документация проекта
jingиtrang(GitHub).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →