Технология Клиент-Сервер 2001'2 |
|||||||
|
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-документа и правила его построения. Это позволяет проверить соответствие экземпляра документа определению.
HTML, например, использует определение типа документа (document type definition, DTD), определяющее, что называть верным Web-документом. Одно из правил DTD для HTML – содержимое Web-страницы должно находиться в элементе <HTML>, а выводимый контент – в элементе <BODY>, содержащемся в родительском элементе <HTML>.
Сходным образом можно создать правила для XML-документа, и проверить их соблюдение.
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.
Как и 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>
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 ООО "К-Пресс"