Продолжается подписка на наши издания! Вы не забыли подписаться?

Назад

Введение в схемы XDR**

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

Рассмотрим пример XML-документа, содержащего три элемента, <PGROUP>, <PERSONA>, и <GRPDESCR>.

<?xml version="1.0" ?>
<PGROUP>
  <PERSONA>MACBETH</PERSONA>
  <PERSONA>BANQUO</PERSONA>
  <GRPDESCR>generals of the king's army.</GRPDESCR>
</PGROUP>

Во всех документах этого класса корневым, верхним элементом будет <PGROUP>. Этот элемент не содержит текста, но содержит один или более дочерних элементов <PERSONA> и один элемент <GRPDESCR>. Элементы <PERSONA> и <GRPDESCR> содержат только текст и не содержат дочерних элементов.

Определение структуры XML-документа

В большинстве случаев не помешает определить структуру XML-документа и правила его построения. Это позволяет проверить соответствие экземпляра документа определению.

HTML, например, использует определение типа документа (document type definition, DTD), определяющее, что называть верным Web-документом. Одно из правил DTD для HTML – содержимое Web-страницы должно находиться в элементе <HTML>, а выводимый контент – в элементе <BODY>, содержащемся в родительском элементе <HTML>.

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

XML Document Type Definition (DTD)

DTD – один из способов оговорить структуру XML-документа. DTD для предыдущего примера выглядит так:

<!DOCTYPE PGROUP [ 
<!ELEMENT PGROUP          (PERSONA+, GRPDESCR) >
<!ELEMENT PERSONA         (#PCDATA)  >
<!ELEMENT GRPDESCR        (#PCDATA)  >
]>

Первая строка, <DOCTYPE PGROUP [, указывает, что тип документа – PGROUP, что заодно является и именем корневого элемента. <!ELEMENT> используется для объявления элементов документа. Элемент <PGROUP> должен включать элементы <PERSONA> и <GRPDESCR>. Знак + означает, что элемент <PGROUP> может включать более одного элемента <PERSONA>.

Формальное описание синтаксиса DTD можно найти в спецификации XML 1.0 на Web-сайте W3C.

DTD имеет следующие недостатки:

Как альтернативу DTD можно использовать описание структуры XML-документов с помощью схем XML-Data.

Схемы XML-Data (XD) и XML-Data Reduced (XDR)

Как и DTD, XD можно применять для определения схемы, структуры или класса документа. XD и XDR лишены недостатков DTD.

Например, вот схема XML-Data для приведенного выше примера:

<?xml version="1.0"?>
<Schema name="schema_sample_1" 
    xmlns="urn:schemas-microsoft-com:xml-data" 
    xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <ElementType name="PERSONA" content="textOnly" model="closed"/>
  <ElementType name="GRPDESCR" content="textOnly" model="closed"/>
  <ElementType name="PGROUP" content="eltOnly" model="closed">
      <element type="PERSONA" minOccurs="1" maxOccurs="*"/>
      <element type="GRPDESCR" minOccurs="1" maxOccurs="1"/>
  </ElementType>
</Schema>

Схемы XML-Data Reduced (XDR)

XDR – это подмножество идей, изложенных в спецификации XML-Data. Реализация схем в парсере MSXML основана на спецификации языка XML-Data Reduced.

Реализация XML-схемы в MSXML основана в первую очередь на XML-Data Note, выпущенном W3C в январе 1998 года, и Document Content Description (DCD) for XML. XML-схемы в Microsoft Internet Explorer 5.0 и более поздних версиях поддерживают подмножество XML-Data, соответствующее DCD. Как вы знаете, Микрософт выпускает такие же продукты, как у других, но другие. Поэтому XML в их реализации имеет слегка измененную грамматику.

Модель содержания, она же модель контента

Модель контента описывает структуру содержания элементов и атрибутов в XML-документе. Для этого используются различные атрибуты, например, model, minOccurs, maxOccurs, order, content, и так далее.

Сначала разберемся со структурой содержания элемента.

Задание модели контента элемента

Рассмотрим, например, XDR-схему (BookSchema.xml), описывающую модель контента различных элементов.

<s:Schema xmlns:s="urn:schemas-microsoft-com:xml-data">
<s:ElementType name="title" content="textOnly"/>
<s:ElementType name="authors" content="textOnly"/>
<s:AttributeType name="pages" content="textOnly"/>
<s:ElementType name="book" order="seq" content="eltOnly">
      <s:attribute type="pages" />
      <s:element type="title" />
      <s:element type="authors" />
</s:ElementType>
</s:Schema>

Модель элементов <title>, <author> и <pages> очень проста. Поскольку атрибут content определяет их как "textOnly", эти элементы не могут содержать ничего, кроме текста (то есть, не могут содержать дочерних элементов).

Модель элемента <book> сложнее. Атрибут content элемента <book> имеет значение "eltOnly". Это указывает, что элемент <book> может содержать только элементы, содержащиеся в схеме (<title>, <author> и <pages>). Более того, в каждом экземпляре элемента <book> дочерние элементы должны следовать в порядке, указанном в схеме.

Вот пример XML-документа, отвечающего этой схеме.

<x:book xmlns:x="x-schema:BookSchema.xml">
  <x:pages>474</x:pages>
  <x:title>Applied XML: A Toolkit for Programmers</x:title>
  <x:authors>Alex Ceponkus and Faraz Hoodbhoy</x:authors>
<x:/book>

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

<...>

Дальше

**Полную версию этой и других статей можно найти в печатной версии журнала.

Copyright © 1994-2016 ООО "К-Пресс"