Как задать доступ к XML Schema

XML Schema используется для проверки правильности, состоятельности XML документа. Поэтому, естественно, чтобы использовать описания XML Schema нужно уметь к ней правильно обратиться.

В спецификации по XML Schema описаны три способа подключения XML Schema, каждый из которых имеет свои особенности, и свою область использования:

Использование атрибутов schemaLocation и noNamespaceSchemaLocation

Атрибуты schemaLocation и noNamespaceSchemaLocation предназначены для подключения XML Schema к XML документу. Различие в использовании этих двух атрибутов, как это можно заметить из их названия, заключается в порядке задания целевого пространства имен схемы.

Атрибут schemaLocation содержит пару значений, первое их которых задает пространство имен XML Schema, а второе - конкретизирует, где непосредственно расположен документ схемы. Например, нам нужно в XML документе, описывающем структуру Тверского государственного университета, подключить XML Schema, которая находится на сайте университета. Фрагмент соответствующего XML документа представлен ниже:

<tgu xmlns="http://www.tversu.ru/Structure" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tversu.ru/Structure http://www.tversu.ru/Structure.xsd"> . . . . . . </tgu>

В представленном примере строка xsi:schemaLocation="http://www.tversu.ru/Structure" задает пространство имен, в котором определена XML Schema, а местоположение схемы непосредственно указано в следующей строке: http://www.tversu.ru/Structure.xsd. Такое задание схемы позволяет приложению четко, однозначно проверить содержание XML документа.

Однако спецификация XML Schema не требует обязательного задания пространства имен для схемы. В случае задания схемы без указания пространства имен используется атрибут noNamespaceSchemaLocation. Пример такого задания представлен фрагментом, аналогичным предыдущему, но с использованием атрибута noNamespaceSchemaLocation.

<tgu xmlns="http://www.tversu.ru/Structure" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.tversu.ru/Structure.xsd"> . . . . . . </tgu>

Как видим в данном случае, схема Structure.xsd не имеет целевого пространства имен, а применяемые имена, описываемые в схеме, не будут иметь префиксов. Задание XML Schema без использования пространства имен может вызвать у приложения конфликтное толкование некоторых ситуаций. Если пространство имен, описывающее стандартные имена, которые приняты в XML Schema, например element, complexType и т.д., объявлено по умолчанию, т.е. без префикса, то возникает неоднозначность. К какому пространству имен отнести данные имена, поскольку в схеме без префикса используются имена стандартного и пользовательского пространства имен.

В спецификации XML Schema для разрешения такой ситуации настоятельно рекомендуется объявлять стандартное пространство с указанием префикса, т.е. не по умолчанию, и в XML Schema всегда добавлять префикс для имен, входящих в стандартное пространство имен. Пример фрагмента XML Schema для иллюстрации данной ситуации представлен ниже.

<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> . . . <xsd:element name="title" type="xsd:string"/> . . . </xsd:schema>

Использование элементов include и import

Действие элемента include аналогично действию этого же элемента в целом ряде языков программирования, например, С/С++. В XML Schema элемент include позволяет вставить в существующую схему другую схему, которую он определяет. При этом конечная, результирующая схема представляется как единая схема.

Для определения местоположения вставляемой схемы в элементе include используется атрибут schemaLocation. Данный атрибут содержит URI ссылку, которая указывает на схему. Пример применения элемента include представлен ниже.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tgu="http://www.tversu.ru/Structure"> . . . <xsd:element name="title" type="xsd:string"/> . . . <include schemaLocation="http://www.tversu.ru/postAddress.xsd"/> . . . </xsd:schema>

В данном примере в начальную схему с помощью оператора include добавлена схема postAddress, описывающая правила задания почтовых адресов.

Элемент import по принципу подключения схемы аналогичен элементу include, но функционально он может описать подключаемую схему точно так же, как она описывается при подключении к XML документу (см. предыдущий раздел).

Элемент import имеет атрибуты namespace и schemaLocation правила использования которых полностью аналогичны правилам использования аналогичных атрибутов, описанных в предыдущем разделе.

Заключение

Все о чем написано выше является правильным с точки зрения корректности подключения XML Schema и, естественно, лучше придерживаться этих правил.

Однако спецификация не требует от приложений обязательно использовать схему, указанную атрибутом schemaLocation. По сути дела это указание является только подсказкой приложению. В спецификации XML Schema в качестве примера приводится редактор HTML, который может иметь встроенную HTML схему, а не обращаться к указанной ему внешней схеме.

Используются технологии uCoz