XML Infoset
XML-формат делает возможным представление документа в виде иерархической структуры, определяющей его информационное пространство XML Infoset в виде множества информационных единиц, имеющих свойства.
Спецификация XML Information Set (XML Infoset) описывает абстрактную модель данных, представленных XML-документом, в виде набора информационных единиц. Каждая информационная единица является абстрактным описанием определенной части XML-документа и имеет набор связанных с ней свойств.
Необязательно каждый XML-документ должен иметь информационное пространство XML Infoset. Информационное пространство XML Infoset имеют лишь XML- документы, отвечающие правилам XML-синтаксиса согласно спецификации XML и соответствующие пространству имен согласно спецификации XML Namespaces.
Таким образом, правильно оформленный XML-документ — это сериализованная форма определенного информационного пространства.
Модель XML Infoset реализуется различными языками программирования в виде объектов, обеспечивающих доступ к частям XML-документа.
Спецификация XML Infoset определяет для XML-документа 11 типов информационных единиц — каждая с соответствующим набором свойств.
Информационное пространство XML-документа содержит как минимум корневую информационную единицу document
. Все остальные информационные единицы информационного пространства XML-документа доступны с помощью свойств корневой информационной единицы document или свойств дочерних для document информационных единиц.
Информационная единица document
имеет следующие свойства:
[children]
— список дочерних для document информационных единиц верхнего уровня, при этом список содержит как минимум одну информационную единицу — document element. Список также содержит информационные единицы processing instruction (инструкция по обработке информационной единицы) и comment (комментарий). Список может содержать информационный элемент document type declaration (DTD-описание или ссылка на DTD -описание структуры XML-документа);[document element]
— идентификатор информационной единицы document element;[notations]
— набор информационных единиц notation (нотации, которые дают возможность передавать приложениям различную информацию, например, способ обработки сущности, не подлежащей разбору);[unparsed entities]
— набор информационных единиц unparsed entity (сущности, не подлежащие разбору);[base uri]
— URI-идентификатор XML-документа;[character encoding scheme]
— символьная кодировка XML-документа;[standalone]
— если YES, тогда указывает автономность документа, т. е. возможность обработки XML-документа без привлечения других документов;[version]
— версия XML-документа;[all declarations processed]
— если true, тогда XML-процессор должен полностью обработать DTD-описание структуры XML-документа.
Каждый XML-документ состоит из элементов, ограниченных тегами и представляющих соответствующие информационные единицы element информационного пространства XML Infoset.
Информационные единицы element являются дочерними по отношению к информационной единице document element и имеют следующие свойства:
[namespace name]
— URI-идентификатор пространства имен, к которому принадлежит элемент;[local name]
— локальная часть имени элемента, которая вместе со свойством [namespace name] образует имя элемента;[prefix]
— префикс пространства имен элемента;[children]
— список дочерних информационных единиц, содержащий информационные единицы element, а также информационные единицы processing instruction (инструкции для обработки), unexpanded entity reference (ссылка на необработанную внешнюю сущность, подлежащую разбору), character (единица текста — последовательности символов) и comment (комментарии) для данного элемента;[attributes]
— набор информационных единиц attribute, представленный атрибутами элемента XML-документа;[namespace attributes]
— набор информационных единиц attribute, представленный атрибутами элемента, объявляющими используемые элементом пространства имен;[in-scope namespaces]
— набор информационных единиц namespace (пространства имен, используемые элементом);[base uri]
— URI-идентификатор элемента;[parent]
— информационная единица, являющаяся родительской.
Атрибуты элементов в виде пар "имя/значение" XML-документа представляют информационные единицы attribute информационного пространства XML Infoset. Атрибуты могут быть определены в XML-документе или установлены по умолчанию.
Атрибуты подразделяются на три типа — строковые, лексемы (знаковый тип) и перечисления.
Информационная единица attribute имеет следующие свойства:
[namespace name]
— URI-идентификатор пространства имен, к которому принадлежит атрибут;[local name]
— локальная часть имени атрибута, которая вместе со свойством [namespace name] образует имя атрибута;[prefix]
— префикс пространства имен атрибута;[normalized value]
— нормализованное значение атрибута с преобразованием пробелов;[specified]
— флаг, указывающий, что атрибут определен в начальном теге элемента или установлен по умолчанию в DTD-описании;[attribute type]
— тип атрибута, объявленный в описании структуры XML- документа. Возможные значения — ID, IDREF, IDREFS (идентификаторы и ссылки на идентификаторы — знаковые типы), ENTITY, ENTITIES (имена сущностей, не подлежащих разбору — знаковые типы), NMTOKEN, NMTOKENS (лексемы имен — знаковые типы), NOTATION (информация, используемая приложением — строковый тип), CDATA (символьная строка — строковый тип) и ENUMERATION (список допустимых значений атрибута — перечисление);[references]
— если тип атрибута равен IDREF, IDREFS, ENTITY, ENTITIES или NOTATION, тогда список информационных единиц element, unparsed entity или notation; если тип атрибута — ID, NMTOKEN, NMTOKENS, CDATA или ENUMERATION, тогда свойство не имеет значения;[owner element]
— информационная единица element, к которой относится данная единица attribute.
Информационная единица processing instruction
, представленная инструкцией обработки элемента в XML-документе, имеет следующие свойства:
[target]
— имя приложения, исполняющего инструкцию;[content]
— данные для приложения в виде пар "имя/значение";[base uri]
— URI-идентификатор инструкции;[notation]
— информационная единица notation, определяющая имя приложения, которое исполняет инструкцию;[parent]
— информационная единица, к которой относится данная инструкция.
Информационная единица unexpanded entity
reference представлена ссылкой на необработанную XML-процессором внешнюю сущность, подлежащую разбору. Эта информационная единица имеет следующие свойства:
[name]
— имя сущности;[system identifier]
— системный идентификатор сущности в виде URI-адреса сущности;[public identifier]
— публичный идентификатор общедоступной сущности в виде URI-адреса сущности;[declaration base uri]
— базовый URI-адрес, относительно которого разрешается системный идентификатор;[parent]
— информационная единица element, к которой относится данная сущность.
Информационная единица character
представлена символьными данными XML- документа и имеет следующие свойства:
[character code]
— символьная кодировка ISO 10646;[element content whitespace]
— если true, тогда символ является пробелом;[parent]
— информационная единица element, к которой относится данная информационная единица character.
Информационная единица comment
представлена комментариями XML-документа и имеет следующие свойства:
[content]
— строка комментария;[parent]
— информационная единицаdocument
илиelement
, к которой относится данный комментарий.
Информационная единица document type declaration
представлена ссылкой или самим DTD-описанием структуры XML-документа и имеет следующие свойства:
[system identifier]
— системный идентификатор внешнего DTD-описания в виде URI-адреса;[public identifier]
— публичный идентификатор общедоступного внешнего DTD-описания в виде URI-адреса;[children]
— список информационных единиц processing instruction, представленных инструкциями обработки DTD-описания;[parent]
— информационная единица document, к которой относится данное DTD -описание.
Информационная единица unparsed entity
представлена сущностью, не подлежащей обработке XML-процессором и объявленной в описании структуры XML- документа. Обычно это ресурс в двоичном формате или другом не XML-формате, например GIF, BMP и др. Информационная единица unparsed entity имеет свойства:
[name]
— имя сущности;[system identifier]
— системный идентификатор сущности в виде URI-адреса сущности;[public identifier]
— публичный идентификатор общедоступной сущности в виде URI-адреса сущности;[declaration base uri]
— базовый URI-адрес, относительно которого разрешается системный идентификатор;[notation name]
— имя нотации, определяющей формат сущности, которая не подлежит обработке;[notation]
— информационная единица notation с именем, указанным в свойстве[notation name]
.
Информационная единица notation
представлена нотацией, объявленной в описании структуры XML-документа. Нотации используются для определения формата сущностей (ресурсов), не подлежащих обработке XML-процессором, а также для указания приложений, получающих инструкции по обработке элементов XML- документа. Эта информационная единица имеет следующие свойства:
[name]
— имя нотации;[system identifier]
— системный идентификатор нотации в виде URI-адреса;[public identifier]
— публичный идентификатор общедоступной нотации в виде URI-адреса;[declaration base uri]
— базовый URI-адрес, относительно которого разрешается системный идентификатор.
Информационная единица namespace представлена пространством имен элемента XML-документа и имеет следующие свойства:
[prefix]
— часть имени, следующая после xmlns:, если префикс отсутствует, тогда пространство имен является установленным по умолчанию;[namespace name]
— пространство имен, следующее после префикса.
Как уже было сказано, XML-документы предназначены для хранения данных. Но приложение, использующее XML-документ, работает не непосредственно с документом, а с его информационным пространством XML Infoset, получаемым как результат разбора XML-документа XML-процессором. Однако информационное пространство XML Infoset может быть получено и другими способами, например, с использованием библиотек API DOM. В этом случае такое информационное пространство называется синтетическим.
XML-документы могут быть двух типов — документы, созданные с учетом правил, которым они должны подчиняться, и документы, не имеющие никаких правил.
При использовании XML-документа, не имеющего правил, вся ответственность за корректность написания документа лежит на его авторе.
Однако чаще всего XML-документы имеют описание своей структуры — XML- схему, представляющую собой набор логических и структурных правил. В этом случае проверку документа на соответствие правилам, определенным в описании структуры документа, производит XML-процессор.
XML-процессоры также могут быть двух типов — обработчики, которые обязаны осуществлять проверку XML-документа на соответствие описания его структуры, и обработчики, не осуществляющие такую проверку.
Описание структуры XML-документа, накладывающее ограничения на структуру и содержание документов данного типа, может быть создано с помощью различных языков, таких как Document Type Definition (DTD), XML Schema, RELAX NG и др.
Первым языком для создания XML-схем был язык Document Type Definition (DTD). Язык DTD является компактным и позволяет включать описание структуры XML- документа непосредственно в сам XML-документ. Но синтаксис языка DTD отличается от XML-синтаксиса, поэтому он прямо не поддерживается платформами и инструментами технологии XML. Кроме того, язык DTD не поддерживает пространства имен, а поддержка типов данных ограничена. Язык DTD не позволяет определять элементы, содержащие целые и вещественные числа, даты и времена и др., и не может указывать сложные связи между элементами.
Язык XML Schema дает более богатые возможности по сравнению с DTD и устраняет его недостатки. Синтаксис XML Schema является XML-синтаксисом, кроме того, в языке XML Schema обеспечена поддержка пространств имен и всех необходимых типов данных. Также язык XML Schema позволяет создавать собственные типы данных и расширять существующие. Использование языка XML Schema обеспечивает трансформацию XML-документа в иерархию объектов определенных типов, доступных программным способом с помощью интерфейса (функциональность Post-Schema-Validation Infoset (PSVI)).
Язык RELAX NG, как и XML Schema, использует XML-синтаксис и по сравнению с XML Schema является более простым и легким в изучении. Язык RELAX NG сочетает в себе простоту DTD и богатые возможности XML Schema. Однако так как язык RELAX NG является в определенном смысле упрощением XML Schema, то он не поддерживает функциональность PSVI и имеет упрощенную типовую модель, что делает необходимым использование сторонних библиотек типов данных.
Здесь мы более подробно остановимся на языке XML Schema.