5. Схемы данных
Схемы данных (Schemas) являются альтернативным способом создания правил построения XML-документов. По сравнению с DTD, схемы обладают более мощными средствами для определения сложных структур данных, обеспечивают более понятный способ описания грамматики языка, способны легко модернизироваться и расширяться. Безусловным достоинством схем является также то, что они позволяют описывать правила для XML-документа средствами самого же XML. Однако это не означает, что схемы могут полностью заменить DTD-описания - этот способ определения грамматики языка используется сейчас практическими всеми верифицирующими анализаторами XML и, более того, сами схемы, как обычные XML-элементы, тоже описываются DTD. Но серьезные возможности нового языка и его относительная простота, безусловно, дают основания утверждать, что будущий стандарт найдет широкое применение в качестве удобного и эффективного средства проверки корректности составления документов. В настоящее время в W3 консорциуме идет работа над первой спецификацией схем данных. Рассмотрим основные возможности схем данных, попытаемся использовать их для контроля корректности ранее описываемых XML-документов.
Внешне документы схем не отличаются от обычных документов XML. Документ размечается при помощи специальных элементов, выполняющих в схемах роль инструкций. Эти инструкции составляют набор правил, используя которые, программа-клиент будет делать вывод о том, корректен документ или нет. Схема данных, например, может выглядеть следующем образом:
<schema id="TeamSchema">
<elementType id="#namee">
<string/>
</elementType>
<elementType id="player">
<element type="#name"/>
<attribute name="number"/>
<attribute name="type"/>
</elementType>
<elementType id="team">
<element type="#player"/>
<attribute name=”title”/>
</elementType>
</schema>
Если мы включим приведенные правила внутрь XML-документа, программа-клиент сможет использовать их для проверки. Т.е. она теперь сможет определить, что правильным будет являться следующий фрагмент:
<team title=”Celtics”>
<player number="1" type=”goalkeeper”><name>John Ree</ name></ player>
<player number="2" type=”back”><name>Peter Loyd</ name></ player>
<player number="2" type=”forward”><name>Emil McGeer</ name></ player>
</team>
Все конструкции языка схем описываются правилами "XML DTD for XML-Data-Schema".
Область схемы данных
Создавая схемы данных, мы определяем в документе специальный элемент, <schema>; внутри которого содержатся описания правил:
<schema id="OurSchema">
<!-- последовательность инструкций -->
</schema>
Если использовать отдельное пространство имен, то полный XML-документ, содержащий в себе схему данных, будет выглядеть следующим образом:
<?XML version='1.0' ?>
<?xml:namespace
href="http://www.mrcpk.nstu.ru/schemas/" as="s"/?>
<s:schema id="OurSchema">
<!-- последовательность инструкций -->
</s:schema>
Описание элементов
Для определения класса элемента, к которому в дальнейшем будут применяться инструкции, описывающие его содержимое и структуру, предназначен специальный элемент схемы elementType. Название элемента задается атрибутом id . Все дальнейшие инструкции, которые относятся к описываемому классу, определяют его внутреннюю структуру и набор допустимых данных, содержатся внутри блока, заданного тэгами <elementType> и </elementType>. При определении класса элемента, можно также использовать комментарии к нему, которые заключаются в тэги <descript></descript>
Атрибуты элемента
Для того, чтобы в описании элемента определить его атрибуты и описать свойства этих атрибутов нужно использовать элемент attribute:
<elementType id="player">
<attribute name="number"/>
…
</elementType>
В данном примере элементу <player> определяется атрибут number, значением которого может быть любая последовательность разрешенных символов:
<player number="0"/>
<player number="some text"/>
Подобно DTD, схемы данных позволяют устанавливать ограничения на значения и способ использования атрибутов. Для этого в дескрипторе <attribute> необходимо использовать параметр atttype. Например, если мы хотим указать, что значение атрибута должно использоваться программой-анализатором как уникальный идентификатор, то нам необходимо создать следующее правило:
<elementType id="player">
<attribute name="number" atttype="ID"/>
</elementType>
Если же требуется задать список возможных значений атрибута, то пример будет выглядеть следующим образом:
<attribute name="type" atttype="ENUMERATION"
values="goalkeeper back halfback forward">
Модель содержимого элемента
Под моделью содержимого в схеме данных понимают описание всех допустимых объектов XML-документа, использование которых внутри данного элемента является корректным. Модель содержимого определяется инструкциями, расположенными внутри блока <elementType>. Вложенные элементы описываются при помощи инструкции element, в которой параметром type указывается класс объекта - ссылка на его определение:
<elementType id="player">
<element type="#name"/>
<element type="#nationality"/>
</elementType>
Если требуется указать режим использования вложенного элемента, то надо определить параметр occurs:
<elementType id="player">
<element type="#name" occurs="REQUIRED"/>
<element type="#nationality" occurs="OPTIONAL"/>
<element type="#clubs" occurs="ONEORMORE"/>
</elementType>
Возможные значения этого параметра таковы:
REQUIRED - элемент должен быть обязательно определен OPTIONAL - использование элемента не является обязательным ZEROORMORE - вложенный элемент может встречаться несколько раз или ни разу ONEORMORE - элемент должен встречаться хотя бы один разПримеры правильных XML-документов, использующих приведенную выше схему:
<player>
<name>John Ree</name>
<nationality>English</ nationality>
<clubs>Celtics</clubs>
<clubs>Portsmut</clubs>
</article>
или
<player>
<name>John Ree</name>
<clubs>Celtics</clubs>
<clubs>Portsmut</clubs>
</article>
Кроме элементов, содержимым XML-документа могут также является обычный текст и области CDATA. Для обозначения типов содержимого текущего элемента в схемах используются следующие инструкции:
<string/> - указывает на то, что содержимым элемента является только свободная текстовая информация(секция PCDATA) :<elementType id="name">
<string/>
</elementType> <any/> - указывает на то, что содержимым элемента должны являться только элементы, без текста, незаключенного ни в один элемент:
<elementType id="coach">
<any/>
</elementType> <mixed> - любое сочетание элементов и текста
<elementType id="player">
<mixed/>
</elementType> <empty> - пустой элемент.
Группировка элементов
Элемент group используется для того, чтобы задать некоторую последовательность вложенных объектов:
<elementType id="team">
<element type="#title" occurs="REQUIRED"/>
<group occurs="OPTIONAL">
<element type="#player">
<element type="#assistant">
</group>
</elementType>
Группировка объектов позволяет определять сразу группу объектов различных типов, которые могут находится внутри данного объекта. В приведенном примере мы указали, что внутри объекта типа conteam могут быть включены элементы title, player, и assistant, причем атрибутом occurs мы указали, что элементы в группе являются необязательными. Корректным для таких схем будут являться следующие фрагменты документов:
<team>
<title>Celtics</tel>
<player> … </player>
<assistant> … </assistant>
</team>
...
<team>
<title>Celtics</tel>
</team>
...
<team>
<title>Celtics</tel>
<player> … </player>
</team>
При помощи атрибута groupOrder можно также задавать режим использования группированных элементов При установленном значении OR возможно использование не всех элементов группы, а лишь некоторых из них. Если задано значение AND, то оба элемента должны быть включены в обязательном порядке. Например, для следующей группы правил:
<elementType id="team">
<element type="#title" occurs="REQUIRED">
<group groupOrder="AND" occurs="OPTIONAL">
<element type="#player">
<element type="#assistant">
</group>
</elementType>
будут считаться правильными только следующие варианты:
<team>
<title>Celtics</tel>
<player> … </player>
<assistant> … </assistant>
</team>
или
<team>
<title>Celtics</tel>
<player> … </player>
</team>
Закрытая и открытая модели описания содержимого элемента
Когда мы определяем модель содержимого текущего элемента, список дополнительных допустимых элементов правилами не ограничивается - он может свободно расширяться. Например, для приведенного выше правила, кроме обозначенных элементов <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 как язык еще не стандартизирован и некоторые его составляющие до сих пор находятся в стадии разработки, видимо, не является причиной невозможности его использования уже сегодня, для решения конкретных задач в реальных системах.
Иллюстрационный пример
Файл Clients.dtd
<!-- parameter entities -->
<!ENTITY % basic.content '#PCDATA'>
<!-- main elements -->
<!ELEMENT clients (client | visitor)*>
<!ELEMENT client (name, password, fullname, address, mail, age, e-mail?, registerIP?, lastlogin, money)>
<!ATTLIST client
id ID #REQUIRED
type (active | passive) #IMPLIED
>
<!ELEMENT visitor (registerIP?)>
<!ATTLIST visitor
id ID #REQUIRED
>
<!-- basic elements -->
<!ELEMENT name (%basic.content;)*>
<!ELEMENT password (%basic.content;)*>
<!ELEMENT fullname (%basic.content;)*>
<!ELEMENT address (%basic.content;)*>
<!ELEMENT mail (%basic.content;)*>
<!ELEMENT age (%basic.content;)*>
<!ELEMENT e-mail (%basic.content;)*>
<!ELEMENT registerIP (%basic.content;)*>
<!ELEMENT lastlogin (%basic.content;)*>
<!ELEMENT money (%basic.content;)*>
<!ATTLIST money
type (current | int) "int"
>
XML документ действительный для этого DTD
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE clients SYSTEM "Clients.dtd">
<clients>
<client id="client-20334-0001" type="active">
<name>John Silver</name>
<password>*********</password>
<fullname>John Fitzerald Silver</fullname>
<address>London, Piccadilli st. 467</address>
<mail>3458739 p.c. 3487 </mail>
<age>41</age>
<e-mail>Silver@hotmail.com</e-mail>
<registerIP>172.36.01.12</registerIP>
<lastlogin>12.01.03</lastlogin>
<money>1290</money>
</client>
<client id="client-20334-0012" type="passive">
<name>Arthur Swift</name>
<password>*********</password>
<fullname>Arthur J. Swift</fullname>
<address>Dublin. Solar st. 463</address>
<mail>65863483 p.c 2342</mail>
<age>61</age>
<lastlogin>12.02.02</lastlogin>
<money type="current"> 1'000.0$</money>
</client>
<visitor id="client-20334-0023">
<registerIP>192.23.41.03</registerIP>
</visitor>
</clients>
W3C схема эквивалентная предыдущему DTD
<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XML Spy v3.5 -->
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">
<xsd:element name="clients">
<xsd:complexType>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="client">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="password">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="fullname">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="address">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="mail">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="age">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="e-mail" minOccurs="0">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="registerIP" type="registerIPType" minOccurs="0"/>
<xsd:element name="lastlogin">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="money">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
<xsd:attribute name="type" use="default" value="int">
<xsd:simpleType>
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="current"/>
<xsd:enumeration value="int"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID" use="required"/>
<xsd:attribute name="type">
<xsd:simpleType>
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="active"/>
<xsd:enumeration value="passive"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="visitor">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="registerIP" type="registerIPType" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="registerIPType" mixed="true">
<xsd:sequence minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:schema>
Литература:
1. “Изучаем XML” Э. Рей – Спб: Символ-Плюс, 2001.
2. “Мифы и реальности XML” Сергей Кузнецов - ИСП РАН, Центр информационных технологий.
3. “Semantic Web: роли XML и RDF” С. Деккер – журнал ‘Открытые системы’ сентябрь 2001
4. Материалы с CIT-forum’a
... форматами поддерживает OLE DB Persistence Provider. Кроме сохранения, можно также загружать (восстанавливать) объект Recordset из файлов. Сохранение и последующая загрузка рекордсета из файла в формате XML дали возможность использования XML-документов в качестве баз данных. OLE DB Persistence Provider жестко задает формат результирующего XML-документа: для описания структуры и типов узлов всегда ...
... документа. Ще одною з очевидних переваг XML є можливість використання її в якості універсальної мови запитів до сховищ інформації. Сьогодні в глибинах W3C знаходиться на розгляді робочий варіант стандарту XML-QL (або XQL), що, можливо, у майбутньому складе серйозну конкуренцію SQL. Крім того, XML-документи можуть виступати в якості унікального засобу збереження даних, що містить у собі одночасно ...
... от необходимости самим создавать соответствующие программы. Присутствует в ASP и PHP, отсутствует в XML. Создание серверных сценариев. Основа любого языка для создания динамических сайтов. Присутствует в ASP и PHP, отсутствует в XML. Описание данных. Важная функция, позволяющая представлять данные в едином формате, единым способом записи. Отсутствует в ASP и PHP, присутствует в XML. Наличие ...
... так как программы отображения не обязаны принимать во внимание расположенную в комментариях информацию. Ее использование зависит от программы. 1.7 Синтаксис и грамматика MathML 1.7.1 Синтаксис и грамматика MathML MathML основан на [XML] (Extensible Markup Language), а значит его синтаксис подчиняется правилам сиснтаксиса XML, и грамматика определяется DTD (Document Type Definition). Другими ...
0 комментариев