XML -схема — это описание типа XML- документа, обычно выражаемое в терминах ограничений на структуру и содержание документов этого типа, помимо основных синтаксических ограничений, налагаемых самим XML. Эти ограничения обычно выражаются с помощью некоторой комбинации грамматических правил, управляющих порядком элементов, булевых предикатов , которым должно удовлетворять содержимое, типов данных, управляющих содержимым элементов и атрибутов, и более специализированных правил, таких как ограничения уникальности и ссылочной целостности .
Существуют языки, разработанные специально для выражения схем XML. Язык определения типа документа (DTD), который является родным для спецификации XML, является языком схем, который имеет относительно ограниченные возможности, но также имеет другие применения в XML помимо выражения схем. Два более выразительных языка схем XML, которые широко используются, — это XML Schema (с заглавной буквы S ) и RELAX NG .
Механизм связывания XML-документа со схемой различается в зависимости от языка схемы. Связь может быть достигнута посредством разметки внутри самого XML-документа или посредством некоторых внешних средств.
Определение схемы XML обычно называют XSD.
Процесс проверки соответствия XML-документа схеме называется проверкой , которая отделена от основной концепции XML синтаксической правильности . Все XML-документы должны быть правильно сформированы, но не требуется, чтобы документ был допустимым, если только XML-анализатор не является «проверяющим», в этом случае документ также проверяется на соответствие связанной с ним схеме. Анализаторы , проверяющие DTD , являются наиболее распространенными, но некоторые также поддерживают XML-схему или RELAX NG.
Проверка документа-экземпляра на соответствие схеме может рассматриваться как концептуально отдельная операция от анализа XML. Однако на практике многие валидаторы схем интегрированы с анализатором XML.
Для указания XML-схемы доступно несколько различных языков. Каждый язык имеет свои сильные и слабые стороны.
Основная цель языка схемы — указать, какой может быть структура XML-документа. Это означает, какие элементы могут находиться в каких других элементах, какие атрибуты допустимы и недопустимы для конкретного элемента и т. д. Схема аналогична грамматике языка ; схема определяет, каким может быть словарь языка и что такое допустимое «предложение».
Существуют исторические и современные языки схем XML:
Основные из них (см. также языки, одобренные ISO 19757 ) описаны ниже.
Хотя существует ряд доступных языков схем, основными тремя языками являются Document Type Definitions , W3C XML Schema и RELAX NG . Каждый язык имеет свои преимущества и недостатки.
DTD, возможно, являются наиболее широко поддерживаемым языком схем для XML. Поскольку DTD являются одними из самых ранних языков схем для XML, определенных еще до того, как XML получил поддержку пространства имен, они широко поддерживаются. Внутренние DTD часто поддерживаются в процессорах XML; внешние DTD поддерживаются реже, но незначительно. Большинство крупных парсеров XML, которые поддерживают несколько технологий XML, также будут поддерживать DTD.
В XSD имеются следующие функции, отсутствующие в DTD:
Схемы XSD традиционно записываются в виде XML-документов, поэтому можно использовать знакомые инструменты редактирования и преобразования.
Помимо проверки, XSD позволяет аннотировать экземпляры XML с информацией о типе ( информационный набор Post-Schema-Validation (PSVI) ), который разработан для упрощения манипуляций экземпляром XML в прикладных программах. Это может быть сделано путем сопоставления типов, определенных в XSD, с типами в языке программирования, таком как Java («привязка данных»), или путем обогащения системы типов языков обработки XML, таких как XSLT и XQuery (известно как «осведомленность о схеме»).
RELAX NG и W3C XML Schema допускают схожие механизмы специфичности. Оба допускают определенную степень модульности в своих языках, включая, например, разделение схемы на несколько файлов. И оба они являются или могут быть определены на [ необходимо уточнение ] языке XML.
RELAX NG не имеет аналогов PSVI . В отличие от W3C XML Schema, RELAX NG был разработан таким образом, что проверка и дополнение (добавление информации о типе и значений по умолчанию) разделены.
W3C XML Schema имеет формальный механизм присоединения схемы к XML-документу, в то время как RELAX NG намеренно избегает таких механизмов по соображениям безопасности и совместимости.
RELAX NG не имеет возможности применять данные атрибутов по умолчанию к списку атрибутов элемента (т. е. изменять набор информации XML), в то время как W3C XML Schema может. Опять же, эта конструкция является преднамеренной и заключается в разделении проверки и дополнения. [8]
W3C XML Schema имеет богатую встроенную систему "простых типов" (xs:number, xs:date и т. д., а также вывод пользовательских типов), в то время как RELAX NG имеет чрезвычайно упрощенную систему, поскольку она предназначена для использования библиотек типов, разработанных независимо от RELAX NG, а не для разработки своих собственных. Некоторые считают это недостатком. На практике схема RELAX NG обычно использует предопределенные "простые типы" и "ограничения" (pattern, maxLength и т. д.) W3C XML Schema.
В схеме W3C XML можно указать конкретное число или диапазон повторений шаблонов, тогда как в RELAX NG это практически невозможно указать вообще (<oneOrMore> или <zeroOrMore>).
Схема W3C XML сложна и трудна для изучения, хотя это отчасти связано с тем, что она пытается сделать больше, чем просто проверку (см. PSVI ).
Хотя быть написанным на XML — это преимущество, в некоторых отношениях это также недостаток. Язык W3C XML Schema, в частности, может быть довольно многословным, в то время как DTD может быть кратким и относительно легко редактируемым.
Аналогично, формальный механизм WXS для связывания документа со схемой может представлять потенциальную проблему безопасности. Для валидаторов WXS, которые будут следовать URI к произвольному онлайн-местоположению, существует потенциальная возможность чтения чего-то вредоносного с другой стороны потока. [9]
Схема W3C XML не реализует большую часть возможностей DTD по предоставлению элементов данных в документе.
Хотя способность W3C XML Schema добавлять атрибуты по умолчанию к элементам является преимуществом, в некоторых отношениях это также является недостатком. Это означает, что XML-файл может быть непригоден для использования при отсутствии его схемы, даже если документ будет соответствовать этой схеме. По сути, все пользователи такого XML-документа должны также реализовать спецификацию W3C XML Schema, тем самым исключая минималистские или старые XML-парсеры. Это также может замедлить обработку документа, поскольку процессор должен потенциально загрузить и обработать второй XML-файл (схему); однако схема обычно затем кэшируется, поэтому затраты возникают только при первом использовании.
Поддержка WXS существует в ряде крупных пакетов анализа XML. Xerces и библиотека базовых классов .NET Framework поддерживают проверку WXS.
RELAX NG обеспечивает большинство преимуществ схемы W3C XML по сравнению с DTD.
Хотя язык RELAX NG может быть записан в XML, он также имеет эквивалентную форму, которая гораздо больше похожа на DTD, но с большей спецификационной мощностью. Эта форма известна как компактный синтаксис. Инструменты могут легко преобразовывать между этими формами без потери функций или даже без комментариев. Даже произвольные элементы, указанные между элементами RELAX NG XML, могут быть преобразованы в компактную форму.
RELAX NG обеспечивает очень сильную поддержку неупорядоченного контента. То есть, он позволяет схеме заявлять, что последовательность шаблонов может появляться в любом порядке.
RELAX NG также допускает недетерминированные модели контента. Это означает, что RELAX NG допускает спецификацию последовательности, подобной следующей:
<zeroOrMore> <ref name= "odd" /> <ref name= "even" /> </zeroOrMore> <необязательно> <ref name = "odd" /> </ необязательно >
Когда валидатор встречает что-то, что соответствует шаблону «нечетный», неизвестно, является ли это необязательной последней ссылкой «нечетный» или просто одной в последовательности zeroOrMore без просмотра данных вперед. RELAX NG допускает такую спецификацию. W3C XML Schema требует, чтобы все ее последовательности были полностью детерминированными, поэтому механизмы, подобные вышеприведенным, должны быть либо указаны по-другому, либо вообще опущены.
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, то первым дочерним элементом элемента должен быть "name", который хранит текст. Если бы "name" не обязательно был первым элементом, то выбор можно было бы обернуть в элемент "interleave" вместе с другими элементами. Порядок указания атрибутов в RELAX NG не имеет значения, поэтому этот блок не обязательно должен быть первым блоком в определении элемента.
Схема W3C XML не может определить такую зависимость между содержимым атрибута и дочерними элементами.
Спецификация RELAX NG перечисляет только два встроенных типа (строка и токен), но позволяет определить гораздо больше. Теоретически отсутствие конкретного списка позволяет процессору поддерживать типы данных, которые очень специфичны для предметной области.
Большинство схем RELAX NG можно алгоритмически преобразовать в схемы W3C XML и даже DTD (за исключением случаев использования функций RELAX NG, не поддерживаемых этими языками, как указано выше). Обратное неверно. Таким образом, RELAX NG можно использовать как нормативную версию схемы, и пользователь может преобразовать ее в другие формы для инструментов, которые не поддерживают RELAX NG.
Большинство недостатков RELAX NG рассмотрены в разделе о преимуществах W3C XML Schema перед 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. Multiple Schema Validator for Java от Sun Microsystems имеет надстройку, которая позволяет проверять схемы RELAX NG, имеющие встроенные правила Schematron.
Технически это не язык схем. Его единственное назначение — направлять части документов в отдельные схемы на основе пространства имен встречающихся элементов. NRL — это просто список пространств имен XML и путь к схеме, которой соответствует каждое из них. Это позволяет каждой схеме иметь дело только с собственным определением языка, а файл NRL направляет валидатор схемы в правильный файл схемы на основе пространства имен этого элемента.
Этот формат XML не зависит от языка схемы и работает практически с любым языком схемы.
Использование заглавных букв в слове схемы : существует некоторая путаница относительно того, когда использовать заглавное написание "Schema", а когда использовать строчное написание. Строчная форма является общим термином и может относиться к любому типу схемы, включая DTD, XML Schema (также известную как XSD), RELAX NG или другие, и всегда должна быть написана с использованием строчных букв, за исключением случаев, когда она появляется в начале предложения. Форма "Schema" (с заглавной буквы), обычно используемая в сообществе XML, всегда относится к W3C XML Schema .
В центре внимания определения схемы находится структура и некоторая семантика документов. Однако проектирование схемы, как и проектирование баз данных, компьютерных программ и других формальных конструкций, также включает множество соображений стиля, соглашений и читаемости. Подробные обсуждения вопросов проектирования схемы можно найти в (например) Maler (1995) [10] и DeRose (1997). [11]
include
и управление модуляцией над пространствами имен) и рекомендуют повторное использование там, где это целесообразно. Различные части обширных и сложных схем Text Encoding Initiative также повторно используются в необычайном разнообразии других схем.Языки: