Схема 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.