Схема XML — это описание типа XML- документа, обычно выраженное в виде ограничений на структуру и содержимое документов этого типа, помимо основных синтаксических ограничений, налагаемых самим XML. Эти ограничения обычно выражаются с использованием некоторой комбинации грамматических правил, управляющих порядком элементов, логических предикатов , которым должно удовлетворять содержимое, типов данных, управляющих содержимым элементов и атрибутов, а также более специализированных правил, таких как ограничения уникальности и ссылочной целостности .
Существуют языки, разработанные специально для выражения схем XML. Язык определения типа документа (DTD), который является родным для спецификации XML, представляет собой язык схем с относительно ограниченными возможностями, но который также имеет в XML и другие применения, помимо выражения схем. Два более выразительных языка схем XML, широко используемые, — это XML Schema (с заглавной буквы S ) и RELAX NG .
Механизм связи XML-документа со схемой зависит от языка схемы. Ассоциация может быть достигнута посредством разметки внутри самого XML-документа или с помощью каких-либо внешних средств.
Определение схемы XML обычно называют XSD.
Процесс проверки соответствия XML-документа схеме называется проверкой и отличается от основной концепции XML — синтаксической правильности . Все документы XML должны быть правильно сформированы, но не требуется, чтобы документ был действительным, если только синтаксический анализатор XML не выполняет «проверку», и в этом случае документ также проверяется на соответствие связанной с ним схемой. Синтаксические анализаторы с проверкой DTD являются наиболее распространенными, но некоторые из них также поддерживают XML Schema или RELAX NG.
Проверка экземпляра документа на соответствие схеме может рассматриваться как концептуально отдельная операция от анализа XML. Однако на практике многие средства проверки схемы интегрированы с анализатором XML.
Для определения схемы XML доступно несколько разных языков. Каждый язык имеет свои сильные и слабые стороны.
Основная цель языка схемы — указать, какой может быть структура XML-документа. Это означает, какие элементы могут находиться в каких других элементах, какие атрибуты разрешены, а какие запрещены для конкретного элемента, и так далее. Схема аналогична грамматике языка ; Схема определяет, каким может быть словарный запас языка и что такое допустимое «предложение».
Существуют исторические и текущие языки схем XML:
Основные из них (см. также языки, одобренные стандартом ISO 19757 ) описаны ниже.
Хотя существует несколько языков схем, основными тремя языками являются определения типов документов , XML-схема W3C и RELAX NG . Каждый язык имеет свои преимущества и недостатки.
DTD, пожалуй, являются наиболее широко поддерживаемым языком схем для XML. Поскольку DTD являются одними из первых языков схем для XML, определенными еще до того, как XML получил поддержку пространства имен, они широко поддерживаются. Внутренние DTD часто поддерживаются процессорами XML; внешние DTD поддерживаются реже, но незначительно. Большинство крупных анализаторов XML, поддерживающих несколько технологий XML, также обеспечивают поддержку DTD.
Доступные в XSD функции, отсутствующие в DTD, включают:
Схемы XSD обычно записываются как документы XML, поэтому можно использовать знакомые инструменты редактирования и преобразования.
Помимо проверки, XSD позволяет аннотировать экземпляры XML информацией о типе ( информационный набор после проверки схемы (PSVI) ), который предназначен для облегчения манипулирования экземпляром XML в прикладных программах. Это может быть осуществлено путем сопоставления типов, определенных в XSD, с типами на таком языке программирования, как Java («привязка данных»), или путем расширения системы типов языков обработки XML, таких как XSLT и XQuery (так называемая «распознавание схемы»).
RELAX NG и W3C XML Schema допускают аналогичные механизмы специфичности. Оба языка допускают определенную модульность, включая, например, разделение схемы на несколько файлов. И оба они определены или могут быть определены в [ необходимо пояснение ] языке XML.
RELAX NG не имеет аналога PSVI . В отличие от XML-схемы W3C, RELAX NG был разработан таким образом, чтобы проверка и дополнение (добавление информации о типе и значений по умолчанию) были разделены.
W3C XML Schema имеет формальный механизм для прикрепления схемы к XML-документу, тогда как RELAX NG намеренно избегает таких механизмов по соображениям безопасности и совместимости.
RELAX NG не имеет возможности применять данные атрибутов по умолчанию к списку атрибутов элемента (т. е. изменять набор информации XML), в то время как W3C XML Schema это делает. Опять же, эта конструкция является намеренной и предназначена для разделения проверки и дополнения. [8]
XML-схема W3C имеет богатую встроенную систему «простых типов» (xs:number, xs:date и т. д., а также создание пользовательских типов), тогда как RELAX NG имеет чрезвычайно упрощенную систему, поскольку она предназначена для использования разработанных библиотек типов. независимо от RELAX NG, а не выращивать самостоятельно. Некоторые считают это недостатком. На практике схема RELAX NG обычно использует предопределенные «простые типы» и «ограничения» (шаблон, maxLength и т. д.) XML-схемы W3C.
В XML-схеме W3C может быть выражено определенное количество или диапазон повторений шаблонов, тогда как в RELAX NG это практически невозможно указать вообще (<oneOrMore> или <zeroOrMore>).
XML-схема W3C сложна и трудна для изучения, хотя отчасти это связано с тем, что она пытается сделать больше, чем просто проверку (см. PSVI ).
Хотя написание на XML является преимуществом, в некотором смысле это также и недостаток. В частности, язык XML-схемы W3C может быть весьма многословным, тогда как DTD может быть кратким и относительно легко редактируемым.
Аналогично, формальный механизм WXS для связывания документа со схемой может представлять собой потенциальную проблему безопасности. Для валидаторов WXS, которые будут следовать по URI к произвольному местоположению в сети, существует вероятность чтения чего-то вредоносного с другой стороны потока. [9]
XML-схема W3C не реализует большую часть возможностей DTD по предоставлению элементов данных в документ.
Хотя способность W3C XML Schema добавлять к элементам атрибуты по умолчанию является преимуществом, в некоторых отношениях это также является недостатком. Это означает, что файл XML может быть непригоден для использования при отсутствии его схемы, даже если документ будет проверен на соответствие этой схеме. По сути, все пользователи такого XML-документа также должны реализовать спецификацию W3C XML Schema, что исключает минималистские или старые синтаксические анализаторы XML. Это также может замедлить обработку документа, поскольку процессору потенциально придется загрузить и обработать второй XML-файл (схему); однако схема обычно кэшируется, поэтому затраты возникают только при первом использовании.
Поддержка WXS существует во многих крупных пакетах синтаксического анализа XML. Xerces и библиотека базовых классов .NET Framework обеспечивают поддержку проверки WXS.
RELAX NG обеспечивает большинство преимуществ XML-схемы W3C по сравнению с DTD.
Хотя язык RELAX NG может быть написан на XML, он также имеет эквивалентную форму, которая больше похожа на DTD, но с большей спецификацией. Эта форма известна как компактный синтаксис. Инструменты могут легко конвертировать между этими формами без потери функций и даже комментариев. Даже произвольные элементы, указанные между XML-элементами RELAX NG, можно преобразовать в компактную форму.
RELAX NG обеспечивает очень мощную поддержку неупорядоченного контента. То есть это позволяет схеме указывать, что последовательность шаблонов может появляться в любом порядке.
RELAX NG также допускает недетерминированные модели контента. Это означает, что RELAX NG позволяет указывать последовательность, подобную следующей:
<zeroOrMore> <ref name= "odd" /> <ref name= "even" /> </zeroOrMore> <optional> <ref name= "odd" /> </optional>
Когда валидатор встречает что-то, что соответствует «нечетному» шаблону, неизвестно, является ли это необязательной последней «нечетной» ссылкой или просто ссылкой в последовательности ZeroOrMore без просмотра данных вперед. RELAX NG допускает такую спецификацию. XML-схема W3C требует, чтобы все ее последовательности были полностью детерминированными, поэтому механизмы, подобные приведенным выше, должны быть либо указаны другим способом, либо вообще опущены.
RELAX NG позволяет рассматривать атрибуты как элементы в моделях контента. В частности, это означает, что можно обеспечить следующее:
<element name= "some_element" > <choice> <attribute name= "has_name" > <value> false </value> </attribute> <group> <attribute name= "has_name" > <value> true </value> </attribute> <element name= "name" ><text /></element> </group> </choice> </element>
В этом блоке указано, что элемент «some_element» должен иметь атрибут с именем «has_name». Этот атрибут может принимать только значения true или false, и если он имеет значение true, первым дочерним элементом элемента должно быть имя, в котором хранится текст. Если «имя» не обязательно должно быть первым элементом, тогда выбор может быть заключен в элемент «чередования» вместе с другими элементами. Порядок указания атрибутов в RELAX NG не имеет значения, поэтому этот блок не обязательно должен быть первым блоком в определении элемента.
XML-схема W3C не может указывать такую зависимость между содержимым атрибута и дочерними элементами.
Спецификация RELAX NG перечисляет только два встроенных типа (строка и токен), но позволяет определять гораздо больше. Теоретически отсутствие специального списка позволяет процессору поддерживать типы данных, которые очень специфичны для конкретной предметной области.
Большинство схем RELAX NG можно алгоритмически преобразовать в XML-схемы W3C и даже DTD (за исключением случаев использования функций RELAX NG, не поддерживаемых этими языками, как указано выше). Обратное неверно. Таким образом, RELAX NG может использоваться как нормативная версия схемы, и пользователь может преобразовать ее в другие формы для инструментов, которые не поддерживают RELAX NG.
Большинство недостатков RELAX NG описаны в разделе о преимуществах XML-схемы W3C перед RELAX NG.
Хотя способность RELAX NG поддерживать определяемые пользователем типы данных полезна, ее недостатком является наличие только двух типов данных, на которые пользователь может положиться. Теоретически это означает, что использование схемы RELAX NG для нескольких валидаторов требует либо предоставления этих пользовательских типов данных этому валидатору, либо использования только двух базовых типов. Однако на практике большинство процессоров RELAX NG поддерживают набор типов данных W3C XML Schema.
Schematron — довольно необычный язык схем. В отличие от трех основных, он определяет синтаксис XML-файла как список правил на основе XPath . Если документ соответствует этим правилам, то он действителен.
Из-за своей природы, основанной на правилах, Schematron очень специфичен. Может потребоваться, чтобы содержимое элемента контролировалось одним из его братьев и сестер. Он также может запрашивать или требовать, чтобы корневой элемент, независимо от того, какой это элемент, имел определенные атрибуты. Он может даже указать необходимые связи между несколькими файлами XML.
Хотя Schematron хорош в реляционных конструкциях, его способность определять базовую структуру документа, то есть, какие элементы куда могут располагаться, приводит к очень многословной схеме.
Типичный способ решения этой проблемы — объединить Schematron с RELAX NG или W3C XML Schema. Для обоих языков доступно несколько процессоров схем, поддерживающих эту комбинированную форму. Это позволяет правилам Schematron указывать дополнительные ограничения для структуры, определенной W3C XML Schema или RELAX NG.
Эталонная реализация Schematron на самом деле представляет собой преобразование XSLT , которое преобразует документ Schematron в XSLT, проверяющий XML-файл. Таким образом, потенциальный набор инструментов Schematron — это любой XSLT-процессор, хотя libxml2 предоставляет реализацию, не требующую XSLT. Средство проверки множественных схем для Java компании Sun Microsystems имеет надстройку, позволяющую проверять схемы RELAX NG со встроенными правилами Schematron.
Технически это не язык схемы. Его единственная цель — направить части документов в отдельные схемы на основе пространства имен встречающихся элементов. NRL — это просто список пространств имен XML и путь к схеме, которой каждое из них соответствует. Это позволяет каждой схеме использовать только свое собственное определение языка, а файл NRL направляет средство проверки схемы к правильному файлу схемы на основе пространства имен этого элемента.
Этот формат XML не зависит от языка схемы и работает практически с любым языком схемы.
Использование заглавной буквы в слове схемы : существует некоторая путаница относительно того, когда использовать написание слова «Схема» с заглавной буквы, а когда — строчные. Форма нижнего регистра является общим термином и может относиться к любому типу схемы, включая DTD, схему XML (она же XSD), RELAX NG или другие, и ее всегда следует писать в нижнем регистре, за исключением случаев, когда она появляется в начале предложения. Форма «Схема» (с заглавной буквы), широко используемая в сообществе XML, всегда относится к XML-схеме W3C .
В центре внимания определения схемы находится структура и некоторая семантика документов. Однако проектирование схемы, как и проектирование баз данных, компьютерных программ и других формальных конструкций, также включает в себя множество соображений стиля, соглашения и читабельности. Подробное обсуждение вопросов проектирования схем можно найти, например, в Maler (1995) [10] и DeRose (1997). [11]
include
управление модуляцией пространств имен) и рекомендуют повторное использование, где это практически возможно. Различные части обширных и сложных схем Text Encoding Initiative также повторно используются в чрезвычайном разнообразии других схем.Языки: