Понимание XML Schema. XSD — умный XML Xsd список возможных значений

XSD - это язык описания структуры XML документа. Его также называют XML Schema. При использовании XML Schema XML парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных.

Такой подход позволяет объектно-ориентированным языкам программирования легко создавать объекты в памяти, что, несомненно, удобнее, чем разбирать XML как обычный текстовый файл.

Кроме того, XSD расширяем, и позволяет подключать уже готовые словари для описания типовых задач, например веб-сервисов, таких как SOAP.

Стоит также упомянуть о том, что в XSD есть встроенные средства документирования, что позволяет создавать самодостаточные документы, не требующие дополнительного описания.

Рассмотрим в качестве примера XSD документ, описывающий часть структуры аккаунта на хабре.

Текст XSD схемы и XML документ , соответствующий этой схеме я не стал включать в статью из-за их размера.

Первая строчка схемы указывает, что документ является XML документом и использует кодировку UTF-8.


Со следующей строки начинается описания главного элемента документа - habra_user .
< xs:element name ="habra_user" >
Строки, документирующие элемент:
< xs:annotation >
< xs:documentation > Главный элемент схемы. Описывает пользователя хабра

Тег описывает «сложный» тип данных user_name . При желании его можно вынести как отдельный тип данных, по аналогии с contact_info . Для этого, нужно блок перенести в и указать атрибут name , а элементу задать атрибут type .

Элементы user_name , first_name , last_name имеют строковый тип и описывают пользователя, имя и фамилию владельца аккаунта.

Элемент date_of_birth имеет тип данных «дата» и описывает дату рождения.

Дату регистрации описывает register_date , имеющий собственный тип данных customDateTime . Значение этого тега будет задаваться с помощью атрибута value . На это указывают строки.

< xs:attribute name ="value" use ="required" >
При этом атрибут - обязательный. Чтобы значение соответствовало требованиям, опишем «проверки»:
< xs:simpleType >
< xs:restriction base ="xs:string" >
< xs:length value ="19" />
< xs:pattern value ="-- ::" />


В таком случае длина строки будет всегда 19, это задано тегом и само значение будет соответствовать шаблону, указанным в теге .

Элементы contact_info и blog - массивы, на это указывает атрибут maxOccurs=«unbounded» .

Тег определяет то, что вложенным элементом будет один из элементов ICQ или linkedin.

Тег указывает на то, что вложенные элементы будут blog_name и blog_url именно в такой последовательности. Если последовательность не важна, то нужно использовать тег .

Ограничения используются для того, чтобы определить приемлемые значения для XML элементов или атрибутов. Ограничения по XML элементам еще называют "фасетами".

Ограничения по значению

age " с ограничением. В этом элементе предполагается указывать возраст человека, а возраст человека, как известно, не может быть меньше 0 и больше 120:

Ограничение по набору значений

Чтобы ограничить содержимое XML элемента неким набором приемлемых значений, следует использовать ограничитель enumeration.

В следующем примере определяется элемент "car " с ограничением. Его единственные приемлемые значения - Audi, Golf, BMW:

Приведенный пример также можно записать следующим образом:

В этом случае тип "carType " может быть использован другими элементами, так как он не является частью элемента "car ".

Ограничения по серии значений

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

В следующем примере определяется элемент "letter " с ограничением. Его единственным допустимым значением может быть ОДНА буква в НИЖНЕМ РЕГИСТРЕ в диапазоне от "a" до "z":

В следующем примере определяется элемент "initials" с ограничением. Его единственным допустимым значением может быть ТРИ буквы в ВЕРХНЕМ РЕГИСТРЕ в диапазоне от "a" до "z":

initials " с ограничением. Его единственным допустимым значением может быть ТРИ буквы в НИЖНЕМ ИЛИ ВЕРХНЕМ РЕГИСТРЕ в диапазоне от "a" до "z":

В следующем примере определяется элемент "choice " с ограничением. Его единственным допустимым значением может быть ОДНА буква из трех: x, y ИЛИ z:

В следующем примере определяется элемент "prodid " с ограничением. Его единственным допустимым значением может быть ПЯТЬ последовательных цифр, и каждая цифра должна быть в диапазоне от 0 до 9:

Другие ограничения по серии значений

В следующем примере определяется элемент "letter " с ограничением. Его допустимым значением является ноль или больше букв в нижнем регистре в диапазоне от a до z:

В следующем примере также определяется элемент "letter " с ограничением. Его приемлемым значением будет одна или больше пара букв, при этом каждая пара должна содержать букву в нижнем регистре, за которой следует буква в верхнем регистре. Например, "sToP" будет соответствовать данному шаблону, а "Stop" или "STOP" или "stop" нет:

В следующем примере определяется элемент "gender " с ограничением. Его приемлемым значением будет только строка "male " ИЛИ "female ":

В следующем примере определяется элемент "password " с ограничением. Его значением должна быть строка из 8 символов, и этими символами могут быть буквы в нижнем или верхнем регистре от a до z, либо цифры от 0 до 9:

Ограничения по пробельным символам

Чтобы определить, как будут восприниматься пробельные символы, используется ограничитель whiteSpace .

В следующем примере определяется элемент "address whiteSpace установлен в значение "preserve ", что указывает XML парсеру НЕ удалять никакие пробельные символы:

В следующем примере также определяется элемент "address " с ограничением. Ограничитель whiteSpace установлен в значение "replace ", что указывает XML парсеру ЗАМЕНИТЬ все пробельные символы (символы табуляции, пробела, конца строки и перевода каретки) символами пробела:

В следующем примере также определяется элемент "address " с ограничением. Ограничитель whiteSpace установлен в значение "collapse ", что указывает XML парсеру УДАЛИТЬ все пробельные символы (символы табуляции, пробела, конца строки и перевода каретки и конечного пробела удаляются, а множественные пробелы заменяются на одинарный символ пробела):

Ограничения по длине

Чтобы ограничить длину значения элемента, следует использовать ограничители length , maxLength и minLength .

В следующем примере определяется элемент "password " с ограничением. Длина его значения должна быть точно 8 символов:

В следующем примере определяется другой элемент "password " с ограничением. Длина его значения должна быть минимум 5 и максимум 8 символов:

Ограничения для типов данных

Ограничитель Описание
enumeration Определяет список приемлемых значений
fractionDigits Определяет максимальное число знаков после десятичной запятой. Должно быть равно или больше нуля
length Определяет точное число символов или объектов списка. Должно быть равно или больше нуля
maxExclusive Определяет верхнюю границу для числовых значений (значение должно быть меньше указанного здесь)
maxInclusive Определяет верхнюю границу для числовых значений (значение должно быть меньше или равно указанному здесь)
maxLength Определяет максимальное число символов или объектов списка. Должно быть равно или больше нуля
minExclusive Определяет нижнюю границу для числовых значений (значение должно быть больше указанного здесь)
minInclusive Определяет нижнюю границу для числовых значений (значение должно быть больше или равно указанному здесь)
minLength Определяет минимальное число символов или объектов списка. Должно быть равно или больше нуля
pattern Определяет точную последовательность приемлемых символов
totalDigits Определяет точное количество допустимых цифр. Должно быть больше нуля
whiteSpace Определяет способ обработки пробельных символов

В жизни каждого аналитика и программиста наступает такой день, когда он узнает о существовании шаблонов (паттернов) проектирования XML-схем и его жизнь меняется. Для меня, например, с этого знания началось постижение красоты проектирования.

Сегодня хочу поговорить о том, какие есть шаблоны проектирования XSD, о преимуществах и недостатках каждого, и почему мы для своих задач выбрали «Райский сад».

Для примера возьмем следующий XML-документ в качестве источника данных.

100 Павел Орлов

Угрешская 2 Москва 115088

И посмотрим, как можно описать одну и ту же структуру XML-документа разными способами.
В основе разделения на шаблоны лежит принцип определения глобальных элементов и/или типов данных внутри XSD.

Матрешка (Russian Doll)


Суть шаблона в том, что схема является зеркалом описываемого ею XML-документа: если сложные элементы содержат внутри себя другие сложные элементы, а те в свою очередь содержат простые, то и в XSD описания таких элементов будут вложены друг в друга. Название шаблон получил в честь известной во всем мире нашей куклы-матрешки, по аналогии с тем, как дочерние элементы в шаблоне инкапсулируются в родительские.

Схема, описывающая структуру нашего файла-источника с использованием шаблона «Матрешка», выглядит так:


Характеристики шаблона:

  • Непрозрачность содержания. Содержание XSD непрозрачно для других схем, и даже для других частей той же схемы. Вследствие чего ни один из типов или элементов внутри XSD не может быть повторно использован.
  • Скрытые области. Области схемы, в которой определяются локальные элементы («City» и «Zip» в примере), локализованы внутри корневого элемента («Address»). В результате если задать в схеме elementFormDefault = «unqualified», то пространства имен локальных элементов («City» и «Zip») скрыты в пределах схемы.
  • Независимость. При такой конструкции каждый компонент схемы является автономным (т.е. не взаимосвязан с другими компонентами). Следовательно, изменения отдельных компонентов будет иметь ограниченное влияние. Например, если добавить в состав адреса элемент «FlatNumber», это никак не повлияет на другие элементы схемы.
  • Компактность. Благодаря такой конструкции все связанные по смыслу данные объединяются в схеме в автономные компоненты, т.е. компоненты являются компактными.

Салями (Salami Slice)


Суть шаблона в том, что описываемый XML-документ разделяется на составные элементы, каждый из которых описывается в XSD как глобальный. Затем описанные элементы соединяются воедино.

Схема, описывающая структуру файла-источника с использованием шаблона «Салями», выглядит так:


Характеристики шаблона:

  • Прозрачность содержания. Все элементы могут видеть другие схемы, а также другие компоненты этой XSD.
  • Глобальность. Так как все элементы схемы объявлены глобально, то независимо от значения elementFormDefault пространства имен схемы в XML-документе будет показан весь набор атрибутов (что-то может быть пустым).
  • Взаимозависимость. При такой конструкции сложные элементы ссылаются на другие части схемы, то есть зависят от них. Следовательно, изменение отдельных компонентов могут повлечь обширные изменения всей схемы.
  • Компактность.

Венецианские жалюзи (Venetian Blind)


Суть шаблона в том, что описываемый XML-документ разделяется на составные типы, каждый из которых описывается в XSD как глобальный. Затем объявляется корневой элемент, соответствующий глобальному типу, соединяющему схему воедино.

Схема, описывающая структуру файла-источника с использованием шаблона «Венецианские жалюзи», выглядит так:


Характеристики шаблона:

  • Прозрачность содержания. Типы данных видны из других схем, а также видны компонентам этой XSD.
  • Максимальное скрытие имен. Объявления элементов локальны, поэтому шаблон имеет максимальный потенциал для скрытия имен.
  • Простое управление скрытием пустых атрибутов. Если пространства имен скрыты, то показывать или нет пустые атрибуты в документах управляется одним переключателем elementFormDefault.
  • Взаимозависимость. При такой конструкции сложные типы данных ссылаются на другие части схемы, то есть зависят от них. Следовательно, изменение отдельных компонентов могут повлечь обширные изменения всей схемы.
  • Компактность. Благодаря такой конструкции все связанные по смыслу данные объединяются в схеме в автономные компоненты, т. е. компоненты являются компактными.

Райский сад (Garden of Eden)


«Райский сад» хорош тем, что определяет каждый элемент и составной тип данных как глобальный. Это позволяет ссылаться на любой тип или элемент в пределах одного XSD или из любой другой XSD и даже из WSDL. Только так можно полностью контролировать семантику и типов и элементов.

Схема, описывающая структуру файла-источника с использованием шаблона «Райский сад», выглядит так:


Характеристики шаблона:

  • Максимальная прозрачность содержания. И типы, и элементы данных видны из других схем, а также видны компонентам этой XSD.
  • Максимальное раскрытие имен. Ничего локально не определяется, поэтому видимость имен максимальная.
  • Взаимозависимость. При такой конструкции сложные типы данных и элементы ссылаются на другие части схемы, то есть зависят от них. Следовательно, изменение отдельных компонентов могут повлечь обширные изменения всей схемы.
  • Громоздкость. Связанные по смыслу данные «размазаны» по определению типа и элемента. «Читать» такую схему сложнее.

Выбор шаблона

При выборе шаблона важно учитывать несколько критериев:
  1. Насколько возможно повторное использование компонентов схемы;
  2. Насколько легко со схемой работать;
  3. Насколько компоненты схемы должны быть взаимозависимы или независимы.

Часто при выборе шаблона проектирования приходится искать баланс между возможностью повторно использовать компоненты схемы и глубиной взаимосвязи между компонентами. На рисунке показан потенциал каждого из шаблонов в разрезе этих двух аспектов.

Те схемы, в которых хорошо поддерживается повторное использование компонентов, с другой стороны имеют сильные взаимосвязи между компонентами. При необходимости что-то поменять в такой схеме разработчик схемы может столкнуться с тем, что менять придется много связанных элементов и/или типов. Такими схемами впоследствии трудно управлять.

В целом можно вывести следующие правила выбора шаблона:

  • если повторное использование компонентов схемы не является необходимым, если важнее удобство использования XSD разработчиками, и строгой необходимости контролировать имена компонентов нет, то следует выбирать «Матрешку»;
  • если повторное использование компонентов важнее удобства для разработчиков, а имена элементов данных нужно контролировать в пределах всей системы, то следует выбирать «Салями»;
  • если вдобавок к предыдущему пункту важно контролировать наименования типов данных и иметь возможность повторно использовать типы данных, следует выбирать «Райский сад»;
  • «Венецианские жалюзи» подойдут в случае, если важно и повторное использование компонентов, и свобода в определении их локальных имен (или возможность скрыть их внутри схемы).

Нам в проекте важнее всего было повторное использование типов и элементов схемы и во вторую очередь тотальный семантический контроль имен. Выбор шаблона был очевиден – Райский сад.

Небольшое лирическое отступление. Самым интересным применением шаблонов проектирования XML-схем на моей памяти был и остается гипноз аудитории. Один наш титулованный аналитик любит брать инициативу в свои руки через рассказ на эту тему. Засекала время, через 5 минут взгляд слушателей тускнеет, и они уходят куда-то далеко в себя. На «Райском саде» сознание большинства отключается.

И в заключении хочу добавить, что миксы шаблонов тоже возможны, мы с ними встречались.

Источники и ресурсы.

1. Создайте XML Shema документ содержащий встроенные типы данных на любую тематику

Отобразите документ в браузере

Лабораторная работа №2

Определение простых типов данных и пространство имен

Цель работы:

Изучить простые типы данных XMLShema и пространства имен

Ход работы:

В схемах XML с помощью встроенных типов можно тремя способами определить новые типы простых элементов. Они вводятся как сужение (restriction) встроенного или ранее определенного простого типа, список (list) или объединение (union) простых типов. Простой тип определяется компонентом схемы simpieType, имеющим вид

Определение типа

· Сужение

Сужение простого типа определяется компонентом restriction, в котором атрибут base указывает сужаемый простой тип, а в содержимом задаются ограничения, выделяющие определяемый простой тип. Например, почтовый индекс zip можно определить как шесть арабских цифр следующим образом

Можно дать другое определение простого типа zip как целого положител ного числа, находящегося в диапазоне от 100000 до 999999:

  • Список

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

21 34 55 4 6

Список определяется компонентом list, в котором атрибутом itemType указывается тип элементов определяемого списка. Тип элементов списка можно определить и в содержимом элемента list. Например, показанный выше элемент документа XML days можно определить в схеме так:

а использованный при его определении тип listofinteger задать как список

не более чем из пяти целых чисел следующим образом:

· Объединение

Простой тип-объединение определяется компонентом union, в котором атрибутом memberTypes можно указать имена объединяемых типов. Например:

Другой способ - записать в содержимом компонента union определения простых типов, входящих в объединение. Например:

-это ограничение, которое может использоваться для того, чтобы сузить набор возможных значений почти любого простого типа.

Пространства имен языка XSD

Имена элементов и атрибутов, используемые при записи схем, определены в пространстве имен с идентификатором http://www.w3.org/2001/XMLSchema. Префикс имен, относящихся к этому пространству, часто называют xs или xsd.

Можно сделать это пространство имен пространством по умолчанию, но тогда надо задать пространство имен для определяемых в схеме типов и элементов. Для удобства такого определения введено понятие целевого пространства имен (target namespace). Идентификатор целевого пространства имен определяется атрибутом targettiamespace, например:

Следует заметить, что в целевое пространство имен попадают только глобальные имена , чьи описания непосредственно вложены в корневой элемент schema.

В схемах и документах XML часто применяется еще одно стандартное пространство имен. Рекомендация языка XSD определяет несколько атрибутов:

type, nil, schemaLocation, noNamespaceSchemaLocation, которые применяются

не только в схемах, а и непосредственно в описываемых этими схемами до

кументах XML, называемых экземплярами схем (XML schema instance). Им на этих атрибутов относятся к пространству имен http://www.w3.org/2001/XMLSchema-instance. Этому пространству имен чаще всего приписывают префикс xsi, например:

xmins:xsi="http://www.w3.org/2001/XMLSchema-instance">

Создайте XMLShema документ с простыми типами данных и пространством имен имен, для этого сделайте следующие:

  1. Откройте новый файл в вашем текстовом редакторе и введите текст XMLShema-документа, листинг которого представлен ниже

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  1. Воспользуйтесь командой Save (Сохранить) текстового редактора, для сохранения документа на вашем жестком диске, присвоив ему имя ProstTip.xsd
  2. Откройте файл в вашем браузере и вас ложно получится то что представлено на рисунке 3.1

Рисунок 3.1

Лабораторная работа №3