Спонсор: Microsoft
Воронежский государственный университет
Опубликован: 04.02.2009 | Доступ: свободный | Студентов: 8251 / 688 | Оценка: 4.14 / 3.78 | Длительность: 19:54:00
Лекция 10:

Языки описания cхем XML

Аннотация: DTD схемы. Недостатки DTD схем. XDR схемы. Элементы и атрибуты XDR схем.

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

  • описать, что именно является разметкой;
  • описать точно, что означает разметка.

Наиболее известными языками описания схем являются следующие:

  • DTD (Document Type Definition) - язык определения типа документов, который первоначально использовался в качестве язык описания структуры SGML-документа.
  • XDR (XML Data Reduced) – диалект схемы XML, разработанный Microsoft, который поддерживался в Internet Explorer 4 и 5 версий.
  • XML Schema или просто XSD ( язык определения схем XML) – рекомендация консорциума W3C с 2001 года.

Рассмотрим подробнее первые два из них. Третий язык описания схем рассматривается в лабораторной работе 11.

DTD схема

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

В рамках DTD модель содержимого XML документа можно описать следующим образом:


Каждый элемент документа может иметь один из типов:

Содержание Синтаксис Комментарий
Данные <!ELEMENT имя (#PCDATA)> Содержит только текстовые данные
Другие элементы <!ELEMENT имя (дочерний элемент 1, дочерний элемент 2)> Содержит только дочерние элементы
Смешанное <!ELEMENT имя (#PCDATA, дочерний элемент)*> Содержит комбинацию текстовых данных и дочерних элементов
EMPTY <!ELEMENT имя EMPTY> Ничего не содержит
ANY <!ELEMENT имя ANY> Может содержать текстовые данные или дочерние элементы

Атрибуты, находящиеся внутри тэгов документа, описываются отдельно с помощью синтаксиса:

<!ATTList  
имя_элемента   имя_атрибута1 (тип)   значение_по_умолчанию
…………………………………………………………………………………... 
имя_элемента   имя_атрибутаN (тип)   значение_по_умолчанию >

При этом атрибут в DTD может иметь один из трех типов:

  • Строка
  • Маркированные атрибут
  • Атрибута с перечислением

Кроме типа атрибута можно также задавать и его модальность:

Значение Описание
#REQUIRED Атрибут обязательно должен быть указан
#FIXED Значение атрибута не должно отличаться от указанного
#IMPLIED Необязательное значение

Рассмотрим в качестве примера описание атрибутов строкового типа для элемента, описывающего некоторое сообщение:

<!ATTLIST message
number	CDATA	#REQUIRED
date		CDATA	#REQUIRED
from		CDATA	#FIXED
status		CDATA	#IMPLIED>

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

<!ATTLIST message
number	ID		#REQUIRED
from		CDATA	#REQUIRED
alert		(low | normal | urgent) "normal">

Маркированных атрибуты элемента могут быть четырех типов:

Значение Описание
ID Уникальный идентификатор элемента (начинается с буквы, двоеточия или подчеркивания)
IDREF Ссылка на элемент, содержащий атрибуты ID
ENTITIES Ссылка на внешний элемент
NMTOKEN Содержит буквы, цифры, точки, знаки подчеркивания, переносы, двоеточия, но не пробелы

И, наконец, в DTD можно использовать следующие индикаторы вхождения последовательностей:

Символ Пример Описание
, (a, b, c) Последовательное использование элементов списка
| (a | b | c) Используется один из членов списка
date Используется один и только один элемент
? subject? Необязательное использование (0 или 1 раз)
+ paragraph+ Используется один или несколько раз
* brother* Используется ноль или несколько раз

В качестве примера приведем DTD схему, описывающую структуру электронного почтового ящика:

<!ELEMENT mailbox (message*)>
<!ELEMENT message (head, body)>
<!ATTLIST message uid CDATA #REQUIRED>
<!ELEMENT head ( from,to+, subject?, CC*, notify?) >
<!ELEMENT from (#PCDATA)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT CC (#PCDATA)>
<!ELEMENT notify EMPTY>
<!ELEMENT body (#PCDATA)>

Исходный XML документ, удовлетворяющий данной схеме, может выглядеть, например, так:

<?xml version="1.0" ?>
<!DOCTYPE mailbox SYSTEM "mailbox.dtd">
<mailbox>
    <message uid="1">
        <head>
            <from>user1@myhp.edu</from>
            <to>user2@myhp.edu</to>
            <subject>Re:</subject>
        </head>
        <body>
            What's up!
        </body>
    </message>
    <message uid="2">
        <head>
            <from>user3@myhp.edu</from>
            <to>user2@myhp.edu</to>
            <subject>Remind</subject>
            <CC> user1@myhp.edu </CC>	  
            <notify/>
        </head>
        <body>
            Remind me about meeting. 
        </body>
    </message>
</mailbox>

Обратите внимание на 2-ю строчку документа, в которой указывается внешняя ссылка на файл, содержащий DTD схему.

В принципе, DTD допускает два способа использования в XML документе.

  • Объявление внутренней схемы:
    <!DOCTYPE корневой_элемент [
    <!ELEMENT корневой_элемент (модель содержания)>
    ]>
  • Объявление внешней схемы:
    <!DOCTYPE корневой_элемент SYSTEM "name.DTD">

В заключение укажем на следующие недостатки DTD схем:

  • Не являются экземплярами XML. Требуется изучение совершенно другого языка.
  • Не предоставляют контроль за типами данных, за исключением самых простых текстовых данных.
  • Не являются экземплярами XML, поэтому их нельзя легко расширить или преобразовать к другим языкам разметки – HTML или DHTML.
  • Не обеспечивают поддержки пространств имен XML.
Михаил Олифиренко
Михаил Олифиренко
Александр Табачук
Александр Табачук

Это только у меня не работает кнопочка "Получить код DreamSpark"? Пишет "временно не доступно..." А когда заработает?