Элементы-составители choice и all

ЛЕКЦИЯ №4. Закрытая и открытая модели описания содержимого элемента . Определение XML Schema

План лекции

1. Закрытая и открытая модели описания содержимого элемента

2. Иерархия классов

3. Ограничения на значения

4. Использование правил из внешних схем

5. Компоненты схем

6. Типы данных

7. Определение XML Schema

8. Простые и сложные типы

9. Кардинальность

10. Ссылки

11. Определение новых типов

12. Группы

13. Элементы-составители choice и all

14. Списки и объединения

15. Ограничения

16. Ограничения уникальности

17. Ограничения по ключу

Закрытая и открытая модели описания содержимого элемента

Когда мы определяем модель содержимого текущего элемента, список дополнительных допустимых элементов правилами не ограничивается - он может свободно расширяться. Например, для приведенного выше правила, кроме обозначенных элементов <title>,<player> и <assistant> вполне могут использоваться дополнительные элементы, неописанные правилами, например, <coach>:

<team>

<title>Celtics</tel>

<coach> … </coach>

<player> … </player>

<assistant> … </assistant>

</team>

Однако в том случае, если мы хотим ограничить создаваемые нами правила от включения дополнительных элементов, мы должны использовать атрибут content и установить для него специальное значение CLOSED:

<elementType id="team" content="CLOSED">

<element type="#title">

<element type="#player">

<element type="#assistant">

</elementType>

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

Иерархия классов

Для того, чтобы при описании класса ограничить список объектов, которые могут являться родительскими для данного элемента, необходимо использовать элемент схемы domain. Инструкция <domain> указывает, что текущий объект должен определяться строго внутри элемента, заданного этим тэгом. Например, в следующем фрагменте указывается, что элемент <player> может быть определен строго внутри тэга <team>:

<elementType id="player">

<element type="#name">

<domain type="#article"/>

</elementType>

Ограничения на значения

Значения элементов могут быть ограничены при помощи тэгов <min> и <max>;:

<elementType id="team">

<element type="#player"><min>11</min><max>25</max>

</elementType>

Использование правил из внешних схем

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

<?XML version='1.0' ?>

<?xml:namespace name="urn:uuid:BDC6E3F0-6DA3-11d1-

A2A3-00AA00C14882/" as="s"/?>

<s:schema>

<elementType id="player">

 <any/>

</elementType>

<elementType id="title">

<string/>

</elementType>

<elementType id="team">

<element type="#title" occurs="REQUIRED"/>

<element type="#player" occurs="ONEORMORE"/>

<element href="http://mrcpk.org/" />

 </elementType></s:schema>

</elementType>

</s:schema>

Компоненты схем

Компоненты, или макроопределении, используются в схемах точно также, как и в DTD. Для их определения предназначены тэги <intEntityDcl/> и <extEntityDcl/>;:

<intEntityDcl name="gk">

Goalkeeper

</intEntityDcl>

<extEntityDcl name="logo" notation="#gif"

systemId= "logo.gif"/>

 

Типы данных

В схемах существует возможность задавать тот или иной тип данных, используя при определении элемента директиву <datatype> с указанием конкретного типа:

<elementType id="counter">

<datatype dt="int">

</elementType>

В DTD мы должны были создать атрибут с конкретным названием, определяющим операцию назначения формата данных, и значением, определенным как fixed. Использование элемента <datatype> позволяет указывать это автоматически, но для обеспечения программной независимости необходимо сначала договориться об обозначениях типов данных(значения, которые должны передаваться параметру dt элемента datatype), для чего могут использоваться, например, универсальные идентификаторы ресурсов URI. В любом случае, как и прежде, все необходимые действия, связанные с конкретной интерпретацией данных, содержащихся в документе, осуществляются программой-клиентом и определяются логикой его работы. В разделе, посвященном DTD, мы уже рассматривали пример XML-документа, реализующего описанные нами возможности. Вот как выглядел бы этот пример при использовании схем данных:

<schema id="someschema">

<elementType id="#rooms_num">

<string/>

<datatype dt="int">

</schema>

<elementType id="#floor">

<string/>

<datatype dt="int">

</schema>

<elementType id="#living_space">

<string/>

<datatype dt="float">

</schema>

<elementType id="#is_tel">

<string/>

<datatype dt="boolean">

</schema>

<elementType id="#counter">

<string/>

<datatype dt="float">

</schema>

<elementType id="#price">

<string/>

<datatype dt="float">

</schema>

<elementType id="#comments">

<string/>

<datatype dt="string">

</schema>

<elementType id="#house">

<element type="#rooms_num" occurs="ONEORMORE"/>

<element type="#floor" occurs="ONEORMORE"/>

<element type="#living_space" occurs="ONEORMORE"/>

<element type="#is_tel" occurs="OPTIONAL"/>

<element type="#counter" occurs="ONEORMORE"/>

<element type="#price" occurs="ONEORMORE"/>

<element type="#comments" occurs="OPTIONAL"/>

</elementType>

</schema>

 ...

<house id="0">

<rooms_num>5</rooms_num>

<floor>2</floor>

<living_space>32.5</living_space>

<is_tel>true</is_tel>

<counter>18346</counter>

<price>34.28</price>

<comments>…</comments>

</house>

...

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

Определение XML Schema

В спецификации XML 1.0 для определения модели информационного наполнения (допустимого порядка следования и вложенности элементов), а также (в ограниченной степени) типов данных атрибутов документа XML предусмотрено использование механизма DTD, но этот механизм имеет целый ряд недостатков:

§ определения DTD оформляются с помощью синтаксиса, отличного от XML;

§ в них отсутствует поддержка пространств имен;

§ они позволяют определить лишь крайне ограниченный набор типов данных.

Поэтому возникла необходимость предусмотреть более полный и строгий метод определения модели информационного наполнения документа XML. Спецификация XML Schema, разработанная W3C, лишена указанных недостатков и обладает гораздо большей выразительной мощью по сравнению с определениями DTD. Дополнительные возможности представления данных позволяют обеспечить гораздо более надежный обмен данными XML между приложениями Web по сравнению с использованием инструментальных средств проверки допустимости, разработанных с учетом требований только конкретного приложения. Схема XML представляет собой определение конкретной структуры XML (ее организации и применяемых в ней типов данных). Язык XML Schema описывает способ определения в схеме элемента каждого типа и позволяет указать типы данных, связанных с каждым элементом. Схема сама является документом XML, в котором используются элементы и атрибуты, выражающие семантику схемы. А поскольку схема — документ XML, то ее можно редактировать и обрабатывать с помощью таких же инструментальных средств, какие применяются для обработки описанного ею документа XML. В этом разделе рассмотрен пример создания схемы XML для документа XML, приведенного в листинге 2 про компанию и двух ее сотрудников.

Простые и сложные типы

Вероятно, один из самых простых способов создания схемы XML coстоит в отслеживании структуры документа и определении каждого элемента по мере его обнаружения. Элементы, содержащие другие элементы, относятся к типу сложных элементов complexType. Например, обнаружив корневой элемент STAFFLIST, можно определить, что он относится к типу complexType. Список дочерних элементов элемента STAFPLIST описывается с помощью элемента sequence. Он относится к типу элемента-составителя (compositor), который определяет упорядоченную последовательность субэлементов:

<xsd:element name = "STAFFLIST">

<xsd:complexType>

<xsd:sequence>

<!-- Здесь должны находиться определения дочерних элементов --> </xsd:sequence>

</xsd:complexType>

</xsd:element>

Каждый из элементов в схеме обозначен типовым префиксом xsd:, который связан с пространством имен W3C XML. Schema с помощью объявления xmlns:xsd = "http://www.w3.org/2000/10/XMLSchema" (это объявление поме­щено в элемент schema). Элементы STAFF и NAME также содержат субэлементы и могут быть определены аналогичным образом. Элементы, не имеющие субэле­ментов или атрибутов, относятся к простому типу simpleType. Например, эле­менты STAFFNO, DOB и SALARY можно представить следующим образом:

<xsd:element name = "STAFFNO» type = "xsd:string"/>

<xsd:element name = "DOB" type = "xsd:date"/>

<xsd:element name = "SALARY"  type = "xsd:decimal"/>

Эти элементы объявлены с помощью заранее определенных типов W3C XML Schema, т.е. string, date и decimal, а для обозначения их принадлежности к словарю XML Schema введен префикс xsd:. Кроме того, атрибут branchNo, ко­торый должен всегда занимать последнюю позицию, может быть объявлен сле­дующим образом:

<xsd:attribute name="branchNo" type="xsd:string"/>

Кардинальность

Язык XML Schema позволяет представить кардинальность некоторого элемен­та с помощью атрибутов minOccurs (минимальное количество вхождений) и maxOccurs (максимальное количество вхождений). Для обозначения необяза­тельного элемента атрибуту minOccurs присваивается значение 0, а для указа­ния на то, что максимальное количество вхождений не ограничено, атрибуту maxOccurs может быть присвоено значение unbounded. В качестве значения лю­бого незаданного атрибута принимается по умолчанию 1. Например, поскольку элемент DOB является необязательным, для обозначения этого может быть пре­дусмотрена следующая конструкция:

<xsd:element name="DOB" type="xsd:date" minOccurs="0"/>

А для регистрации вплоть до трех имен ближайших родственников (Next-Of-Kin — NOK) каждого сотрудника компании можно применить конструкцию

<xsd:element name= "NOK" type="xsd:string" minOccurs="0" maxOccurs="3"/

Ссылки

Хотя метод, описанный выше (который предусматривает разработку опреде­ления для каждого обнаруженного элемента), является относительно простым, он не позволяет добиться глубокой вложенности встроенных определений, а по­лученная в результате схема может оказаться неудобной для чтения и сопрово­ждения. Поэтому для создания схемы применяется также подход с использованием ссылок (reference) на объявления элементов и атрибутов, находящихся в области определения того элемента, в котором они используются. Например, можно определить элемент STAFFNO следующим образом:

<xsd:element name="STAFFNO" type="xsd:string"/>

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

<xsd:element ref="STAFFNO"/>

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

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

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

 

<xsd:simpleType name="STAFFNOTYPE">

<xsd:restriction base="xsd:string">

<xsd:maxLength value="5"/>

</xsd:restriction>

</xsd:simpleType>

Этот новый тип определен как ограничение (restriction) данных типа string из пространства имен XML Schema (атрибут base), а также указано, что он имеет мак­симальную длину 5 символов (элемент maxLength называется фасетом), В специфи­кации XML Schema предусмотрено 15 фасетов, в том числе length, minLength. minlnclusive и maxlnclusive. Двумя другими чрезвычайно удобными фасетами являются pattern и enumeration. Элемент pattern определяет регулярное выра­жение, с которым должно сопоставляться проверяемое значение. Например, на эле­мент STAFFNO может быть наложено ограничение, чтобы его значение состояло из двух прописных символов, за которыми следуют от одной до трех цифр (например, SG5, SG37, SG999). Это требование можно представить на языке XML Schema с по­мощью следующего шаблона pattern:

<xsd:pattern value="[A-Z]{2}[0-9] {l,3}">

Элемент enumeration позволяет ограничить простой тип набором различи­мых значений. Например, на элемент POSITION, содержащий данные о должно­сти, можно наложить ограничение, согласно которому он может иметь только значения Manager, Supervisor или Assistant. Такое требование можно пред­ставить в схеме с помощью следующего перечисления enumeration:

<xsd:enumeration value="Manager"/>
<xsd:enumeration value="Supervisor"/>
<xsd:enumeration value="Assistant"/>

Группы

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

<xsd:group name="STAFFTYPE">

<xsd:sequence>

<xsd:element name="STAFFNO" type="STAFFNOTYPE"/>

<xsd:element name="POSITION" type="POSITIONTYPE"/>

<xsd:element name="DOB" type="xsd:date"/>

<xsd:element name="SALARY" type="xsd:decimal"/>

</xsd:sequence>

</xsd:group>

После обработки этой конструкции создается именованная группа STAFFTYPE, представляющая собой последовательность элементов (для упрощения здесь пока­заны только некоторые элементы STAFF). В определении схемы можно также соз­дать элемент STAFFLIST со ссылкой на группу, определенную как последователь­ность в количестве нуль или больше элементов STAFFTYPE, следующим образом:

<xsd:element name="STAFFLIST">

<xsd:complexType>

<xsd: sequen.ce>

<xsd:group ref="STAFFTYPE" minOccurs="0" maxOccurs ="unbounded"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

Элементы-составители choice и all

Как указано выше, sequence — это представитель одного из типов элемента-составителя (compositor). Предусмотрены еще два типа элементов-составителей: choice и all. Элемент-составитель choice определяет возможность выбора ме­жду несколькими допустимыми элементами или группами элементов, а элемент-составитель all определяет неупорядоченный набор элементов. Например, та­кую ситуацию, при которой имя сотрудника компании может быть обозначено только одной строкой или сочетанием двух строк (с именем и фамилией), можно отразить с помощью следующей конструкции:

<xsd:group name="STAFFNAMETYPE">

<xsd:choice>

<xsd:element name="NAME" type="xsd:string"/>

<xsd:sequence>

<xsd:element name="FNAME"   type="xsd:string"/>

<xsd:element name="LNAME" type="xsd:string"/>

</xsd.-sequence>

</xsd:choice>

</xsd:group>

Списки и объединения

Для создания списков элементов, разделенных пробелами, применяется эле­мент list. Например, список, содержащий табельные номера сотрудников ком­пании, может быть создан следующим образом:

<xsd:simpleType name="STAFFNOLIST">

<xsd:list itemType=STAFFNOTYPE/>

</xsd:simpleType>

Ниже приведен пример применения этого типа в документе XML.

<STAFFNOLIST>"SG5" "SG37" "SG999"</STAFFNOLIST>

Теперь на основе списка этого типа может быть определен новый тип, пред­ставляющий собой некоторую форму ограничения, например, может быть объ­явлен ограниченный список, количество элементов в котором равно 10, следую­щим образом:

<xsd:simpleType name="STAFFNOLIST10">

<xsd:restriction base="STAFFNOLIST">

<xsd:Length value="10"/>

</xsd: restriction>

</xsd:simpleType>

Простые типы (называемые также элементарными) и списки позволяют оп­ределять значения элементов или атрибутов, состоящие из одного или несколь­ких экземпляров некоторого элементарного типа. В отличие от этого, тип объе­динения позволяет выбирать значения элемента или атрибута из одного или не­скольких экземпляров одного типа, выбранных из объединения нескольких элементарных типов или списков. Применяемый при этом формат аналогичен объявлению choice, описанному выше, поэтому здесь не приведено его подроб­ное описание. Заинтересованный читатель может обратиться к документу W3< XML Schema. Пример схемы XML для документа XML, приведенного в листинге 2, показан в листинге 6.

Листинг 6. Схема XML для документа XML, приведенного в листинге 2

<?xml version= "1.0" encoding» "UTF-8"?>

<xsd:schema xmlns:xsd= "http://www.w3.org/2000/l0/XMLSchema">

<!-- Создать группу для STAFFLIST -->

<xsd:group name="STAFFLISTGROUP">

<xsd:element name="STAFFLIST">

<xsd:complexType>

<xsd:sequence>

<xsd:group ref="STAFFTYPE" minOccurs="0" maxOccurs                  ="unbounded"/>

</xsd:seguence>

</xsd:complexType>

</xsd:element>

</xsd:group>

<!-- Создать тип для элемента STAFFNO -->

<xsd:simpleType name="STAFFNOTYPE">

<xsd:restriction base="xsd:string">

<xsd.-maxLength value="5"/>

<xsd:pattern value="[A-Z]{2}[0-9]{l,3}">

</xsd: restriction>

</xsd:simpleType>

<!-- Создать тип для атрибута branchNo -->

<xsd:simpleType name="BRANCHNOTYPE">

<xsd:restriction base=^xsd: strin.g">

<xsd:maxLength value="4"/>

<xsd:pattern value»"[A-Z] [0-9]{3}">

</xsd:restriction>

</xsd:simpleType>

<!-- Создать тип для элемента POSITION ->

<xsd:simpleType name="POSITIONTYPE">

<xsd:restriction base="xsd:string">

<xsd:enumeration value="Manager"/>

<xsd:enumeration value»"Supervisor"/>

<xsd:enumeration value="Assistant"/>

</xsd:restriction>

</xsd:simpleType>

<!-- Создать группу для элемента STAFF -->

<xsd:group name="STAFFTYPE">

<xsd:element name="STAFF" >

<xsd:complexType>

<xsd:seguence>

<xsd:element name="STAFFNO" type="STAFFNOTYPE"/>

<xsd:element name="NAME">

<xsd:complexType>

<xsd.- seguence>

<xsd:element name="FNAME" type="xsd:string"/>

<xsd:element name="LNAME" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:element name="POSITION" type="POSITIONTYPE"/>

<xsd:element name="DOB" type="xsd:date"/>

<xsd:element name="SALARY" type="xsd:decimal"/>

<xsd:attribute name="branchNo" type="BRANCHNOTYPE"/>

<xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:group>

</xsd:schema>

Ограничения

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

Ограничения уникальности

Для определения ограничения уникальности должен быть задан элемент unique, определяющий элементы или атрибуты, которые должны быть уникальными. Например, можно определить ограничение уникальности по данным, состоящим из фамилии и даты рождения (Date Of Birth — DOB) сотрудника компании, с помощью следующей конструкции:

<xsd:unique name="NAMEDOBUNIQUE">

<xsd:selector xpath="STAFF"/>

<xsd:field xpath="NAME/LNAME"/>

<xsd:field xpath="DOB"/>
</xsd:unique>

Местонахождение уникального элемента в схеме позволяет определить кон­текстный узел, на который распространяется такое ограничение. В данном случае дескриптор, задающий ограничение, следует за элементом STAFF; тем самым указано, что это ограничение должно быть уникальным только в контексте элемента STAFF, аналогично тому, как определяется ограничение на отношении в реляционной СУБД. Выражения XPath, заданные в следующих трех элементах, являются относительными к контекстному узлу. Первое выражение XPath с элементом selector задает элемент, на который распространяется ограничение уникальности (в данном случае STAFF), а следующие два элемента field указывают узлы, которые должны проверяться на уникальность.

Ограничения по ключу

Ограничение по ключу аналогично ограничению уникальности, за исключением того, что проверяемое с помощью него значение не должно быть пустым. Оно также позволяет ссылаться на ключ. В следующем примере показано oграничение по ключу, заданное на узле STAFFNO:

<xsd:Jcey name="STAFFNOISKEY">

<xsd:selector xpath="STAFF"/>

<xsd:field xpath="STAFFNO"/>

</xsd:key>

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

<xsd:keyref name="BRANCHNOREF" refer "BRANCHNOISKEY">

<xsd:selector xpath="STAFF"/>

<xsd.-field xpath="@branchNo"/>

</xsd:keyref>

Вопросы для самопроверки знаний:

 


Дата добавления: 2022-01-22; просмотров: 16; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!