ref xml что это
Шаблоны проектирования XSD
В жизни каждого аналитика и программиста наступает такой день, когда он узнает о существовании шаблонов (паттернов) проектирования XML-схем и его жизнь меняется. Для меня, например, с этого знания началось постижение красоты проектирования.
Сегодня хочу поговорить о том, какие есть шаблоны проектирования XSD, о преимуществах и недостатках каждого, и почему мы для своих задач выбрали «Райский сад».
Для примера возьмем следующий XML-документ в качестве источника данных.
И посмотрим, как можно описать одну и ту же структуру XML-документа разными способами.
В основе разделения на шаблоны лежит принцип определения глобальных элементов и/или типов данных внутри XSD.
Матрешка (Russian Doll)
Суть шаблона в том, что схема является зеркалом описываемого ею XML-документа: если сложные элементы содержат внутри себя другие сложные элементы, а те в свою очередь содержат простые, то и в XSD описания таких элементов будут вложены друг в друга. Название шаблон получил в честь известной во всем мире нашей куклы-матрешки, по аналогии с тем, как дочерние элементы в шаблоне инкапсулируются в родительские.
Схема, описывающая структуру нашего файла-источника с использованием шаблона «Матрешка», выглядит так:
Салями (Salami Slice)
Суть шаблона в том, что описываемый XML-документ разделяется на составные элементы, каждый из которых описывается в XSD как глобальный. Затем описанные элементы соединяются воедино.
Схема, описывающая структуру файла-источника с использованием шаблона «Салями», выглядит так:
Венецианские жалюзи (Venetian Blind)
Суть шаблона в том, что описываемый XML-документ разделяется на составные типы, каждый из которых описывается в XSD как глобальный. Затем объявляется корневой элемент, соответствующий глобальному типу, соединяющему схему воедино.
Схема, описывающая структуру файла-источника с использованием шаблона «Венецианские жалюзи», выглядит так:
Райский сад (Garden of Eden)
«Райский сад» хорош тем, что определяет каждый элемент и составной тип данных как глобальный. Это позволяет ссылаться на любой тип или элемент в пределах одного XSD или из любой другой XSD и даже из WSDL. Только так можно полностью контролировать семантику и типов и элементов.
Схема, описывающая структуру файла-источника с использованием шаблона «Райский сад», выглядит так:
Выбор шаблона
Часто при выборе шаблона проектирования приходится искать баланс между возможностью повторно использовать компоненты схемы и глубиной взаимосвязи между компонентами. На рисунке показан потенциал каждого из шаблонов в разрезе этих двух аспектов.
Те схемы, в которых хорошо поддерживается повторное использование компонентов, с другой стороны имеют сильные взаимосвязи между компонентами. При необходимости что-то поменять в такой схеме разработчик схемы может столкнуться с тем, что менять придется много связанных элементов и/или типов. Такими схемами впоследствии трудно управлять.
Нам в проекте важнее всего было повторное использование типов и элементов схемы и во вторую очередь тотальный семантический контроль имен. Выбор шаблона был очевиден – Райский сад.
Небольшое лирическое отступление. Самым интересным применением шаблонов проектирования XML-схем на моей памяти был и остается гипноз аудитории. Один наш титулованный аналитик любит брать инициативу в свои руки через рассказ на эту тему. Засекала время, через 5 минут взгляд слушателей тускнеет, и они уходят куда-то далеко в себя. На «Райском саде» сознание большинства отключается.
И в заключении хочу добавить, что миксы шаблонов тоже возможны, мы с ними встречались.
XSD элемент element
Элемент element определяет элемент.
Синтаксис элемента
Атрибуты элемента
Атрибут | Описание | ||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | Не обязательный. Определяет уникальный идентификатор для элемента | ||||||||||||||||||||||||||||||||||
name | Не обязательный. Определяет имя элемента. Этот атрибут требуется, если родительским элементом является элемент schema | ||||||||||||||||||||||||||||||||||
ref | Не обязательный. Ссылается на имя другого элемента. Атрибут ref может включать префикс пространства имен. Этот атрибут нельзя использовать, если родительским элементом является элемент schema | ||||||||||||||||||||||||||||||||||
type | Не обязательный. Определяет либо имя встроенного типа данных, либо имя элемента simpleType или complexType | ||||||||||||||||||||||||||||||||||
substitutionGroup | Не обязательный. Определяет имя элемента, который может быть замещен этим элементом. Этот атрибут нельзя использовать, если родительским элементом является не элемент schema | ||||||||||||||||||||||||||||||||||
default | Не обязательный. Определяет значение элемента по умолчанию (может использоваться только если содержимое элемента простого типа или текст) | ||||||||||||||||||||||||||||||||||
fixed | Не обязательный. Определяет фиксированное значение элемента (может использоваться только если содержимое элемента простого типа или текст) | ||||||||||||||||||||||||||||||||||
form | Не обязательный. Определяет форму элемента. Значение «qualified» указывает на то, что этот элемент должен уточняться префиксом пространства имен. Значение «unqualified» указывает на то, что этот элемент не требует уточнения префиксом пространства имен. Значением по умолчанию является значение атрибута elementFormDefault атрибута элемента schema. Этот атрибут нельзя использовать, если родительским элементом является элемент schema | ||||||||||||||||||||||||||||||||||
maxOccurs | Не обязательный. Определяет, сколько раз максимально может появляться элемент в родительском элементе. Значением может быть любое целое число >= 0, если же нужно снять лимит на использование, то следует указать ключевое слово «unbounded». Значение по умолчанию 1. Этот атрибут нельзя использовать, если родительским элементом является элемент schema | ||||||||||||||||||||||||||||||||||
minOccurs | Не обязательный. Определяет, сколько раз минимально может появляться элемент в родительском элементе. Значением может быть любое целое число >= 0. Значение по умолчанию 1. Этот атрибут нельзя использовать, если родительским элементом является элемент schema | ||||||||||||||||||||||||||||||||||
nillable | Не обязательный. Определяет, можно ли элементу присваивать явное нулевое значение nil. Значение true позволяет элементу устанавливать атрибут nil в значение true. Атрибут nil определен как часть пространства имен XML схемы. Значение по умолчанию false | ||||||||||||||||||||||||||||||||||
abstract | Не обязательный. Определяет, можно ли использовать этот элемент в документе. Значение true определяет, что элемент не может использоваться в документе. Вместо этого, на месте данного элемента должен появляться другой элемент, атрибут substitutionGroup которого содержит имя с префиксом (QName) этого элемента. Значение по умолчанию false | ||||||||||||||||||||||||||||||||||
block |
Название фасетки | Описание | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Наибольшее значение, которое больше не входит в определяем тип | ||||||||||||||||||||||
Наибольшее значение определяемого типа | ||||||||||||||||||||||
Наименьшее значение, которое больше не входит в Определяемый тип | ||||||||||||||||||||||
Наименьшее значение определяемого типа | ||||||||||||||||||||||
Общее количество цифр в определяемого числовом типе; сужение типа decimal | ||||||||||||||||||||||
Количество цифр в дробной части числа | ||||||||||||||||||||||
Длина значений определяемого типа | ||||||||||||||||||||||
Наибольшая длина значений определяемого типа | ||||||||||||||||||||||
Наименьшее длина значений определяемого типа | ||||||||||||||||||||||
Одно из перечисленных значений | ||||||||||||||||||||||
В тегах-фасетка также могут иметь атрибуты. Эти атрибуты называют базисными фасетками (fundamental facets). Среди них выделяют: complexTypeСхема: базовый элемент Группы элементовГруппа позволяет описать общие элементы. (работает как include) Схема: CIV. Функции разборщика XMLXML (eXtensible Markup Language) это формат данных для обмена структурированными документами в Web. Это стандарт, созданный консорциумом World Wide Web consortium (W3C). Информация о XML и сопутствующих технологиях находится на сайте http://www.w3.org/XML/ УстановкаЭто расширение использует библиотеку expat, которую можно найти на http://www.jclark.com/xml/. Makefile, который поставляется вместе с expat, не строит библиотеку по умолчанию. Вы можете использовать такое make-правило: Постройте PHP. Tada! Вот и всё. Об этом расширенииЭто расширение позволяет создавать XML-разборщики и определять обработчики различных XML-событий. Каждый XML-разборщик также имеет несколько параметров, которые вы можете настроить. Вот имеющиеся XML-обработчики: Таблица 1. Поддерживаемые XML-обработчикиВыравнивание регистра/Case FoldingСледующие константы определены для кодов ошибок XML (как возвращаемые xml_parse() ):
Целевая кодировка выполняется, когда PHP передаёт данные функциям XML-обработчиков. Когда XML-обработчик создаётся, устанавливается та же самая целевая кодировка, что и исходная кодировка, но она может быть изменена в любой момент. Целевая кодировка влияет на символьные данные и на имена тэгов и цели инструкций процессинга. Если XML-разборщик находит символы вне диапазона представления исходной кодировки, он возвратит ошибку. Если PHP находит в разбираемом XML-документе символы, которые не могут быть представлены в избранной целевой кодировке, проблемные символы будут «понижены в звании». В настоящее время это означает, что такие символы заменяются знаком вопроса. Вот примеры скриптов PHP, разбирающих XML-документы. Пример структуры XML-элементовВ первом примере отображается структура стартовых элементов документа с отступом. Пример внешнего экземпляра XMLЭтот пример разъясняет XML-код. Он показывает, как использовать обработчик ссылки на внешний экземпляр для включения и разбора других документов, а также то, как можно обработать PI, и способ определения «trust/доверия» PI, содержащим код. Пример XML схемыВ этой главе будет показано, как писать XML схемы. Также вы узнаете, что схемы можно писать разными способами. XML документДавайте посмотрим на следующий XML документ под названием «shiporder.xml»: Приведенный выше XML документ состоит из корневого элемента shiporder с обязательным атрибутом orderid. Элемент shiporder содержит три дочерних элемента: orderperson, shipto и item. Элемент item используется дважды и содержит элемент title, необязательный элемент note, а также элементы quantity и price. Строка xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» говорит XML парсеру, что этот документ должен быть проверен на соответствие схеме. Строка xsi:noNamespaceSchemaLocation=»shiporder.xsd» указывает, где именно находится схема (в данном случае она находится в той же папке, что и файл «shiporder.xml»). Создание XML схемыТеперь для приведенного выше XML документа создадим XML схему. Создадим новый файл, который назовем «shiporder.xsd». Для создания XML схемы будем просто следовать за структурой XML документа и определять каждый встреченный элемент. Начнем со стандартной XML декларации, за которой опишем элемент xs:schema, который и определяет саму схему: Здесь мы используем стандартное пространство имен (xs) и URI, ассоциированный с этим пространством имен, который имеет стандартное значение http://www.w3.org/2001/XMLSchema. Теперь мы должны определить элемент shiporder. У этого элемента есть атрибут, и он содержит другие элементы, поэтому мы рассматриваем его как элемент составного типа. Определения дочерних элементов элемента shiporder поместим в декларацию xs:sequence, что задает жесткую последовательность подэлементов: Теперь определим элемент orderperson, который будет простого типа (так как он не содержит ни атрибуты, ни другие элементы). Его тип (xs:string) имеет префикс пространства имен, ассоциированного с XML схемой, что указывает на использование предопределенного типа данных: Теперь нам нужно определить два элемента составного типа: shipto и item. Начнем с определения элемента shipto: При помощи схем мы можем определить число возможных вхождений любого элемента. В этом нам помогут атрибуты maxOccurs и minOccurs. Атрибут maxOccurs задает максимальное число вхождений элемента, а атрибут minOccurs задает минимальное число вхождений. По умолчанию значение обоих атрибутов равно 1. Теперь определим элемент item. Этот элемент может использоваться неограниченное число раз внутри элемента shiporder. Определить такую особенность элемента item позволяет присваивание атрибуту maxOccurs значения «unbounded». Это означает, что элемент item может использоваться столько раз, сколько нужно автору документа. Обратите внимание, что элемент note опционален. Определим это установив атрибут minOccurs в нулевое значение: Теперь мы можем декларировать атрибут элемента shiporder. Поскольку это обязательный атрибут, используем определение use=»required». Примечание: Атрибуты должны всегда декларироваться последними: Вот полный код файла схемы «shiporder.xsd»: Разделение схемыПредыдущий способ компоновки схемы весьма прост, однако, когда документ достаточно сложен, при подобном способе соответствующая схема может оказаться довольно громоздкой, что сильно скажется на удобстве ее чтения и поддержки. Следующий способ компоновки схемы заключается в том, что сначала определяются все элементы и атрибуты, а затем на эти определения создаются ссылки при помощи атрибута ref. Ниже приводится новая компоновка файла схемы («shiporder.xsd»): Использование поименованых типовТретий способ компоновки схемы предполагает определение классов или типов, которые позволяют повторное использование определений элементов. Это становится возможным, если дать имена элементам simpleTypes и complexTypes, а затем указать на них при помощи атрибута type. Третий способ компоновки файла схемы («shiporder.xsd»): Элемент restriction указывает на то, что тип данных является производным от типов данных из пространства имен W3C XML Schema. Таким образом, следующий фрагмент кода означает, что значение элемента или атрибута должно быть строковым: Однако гораздо чаще элемент restriction используется для накладывания ограничений на элементы. Посмотрите на следующие строки из приведенной выше схемы: Этот фрагмент кода указывает, что значение элемента или атрибута должно быть строковым, ровно шесть символов в длину, и этими символами должны быть цифры от 0 до 9.
|