Определение шаблона документа DTD

Стандарт определения шаблона документа (Document Type Definition, DTD) был разработан для описания модели содержания XML-документов. Он определяет элементы, атрибуты документа и некоторые ограничения на количество вхождений дочерних элементов, обязательность вхождения атрибутов и элементов и содержащиеся в них данные.

Рассмотрим пример заказа в интернет-магазине, составленный на языке XML:

<?xml version="1.0" encoding="utf-8"?>

<order customerId="13242">

<address>

<city>Москва</city>

<street>Каширское шоссе</street>

<house>31</house>

</address>

<date>2006-04-23</date>

<time>12:40:23</time>

<items>

<item>

<id>12332</id>

<name>Монитор</name>

<quantity>1</quantity>

</item>

<item>

<id>2332</id>

<name>Видеокарта</name>

<quantity>2</quantity>

</item>

</items>

</order>

Зададим для этого документа определение, добавив в него ссылку на файл содержащий DTD:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE order SYSTEM "order.dtd">

<order customerId="13242">

...

</order>

Декларация DOCTYPE содержит имя корневого элемента и ссылку на файл DTD. Существует также другой способ задания шаблона документа, путем включения самого содержимого шаблона в XML-документ:

<!DOCTYPE order [ содежимое файла order.dtd ]>

Соответствующий этому примеру файл «order.dtd» выглядит следующим образом:

<!ELEMENT order (address, date, time, items)>

<!ELEMENT address (city, street, house)>

<!ELEMENT city (#PCDATA)>

<!ELEMENT street (#PCDATA)>

<!ELEMENT house (#PCDATA)>

<!ELEMENT date (#PCDATA)>

<!ELEMENT time (#PCDATA)>

<!ELEMENT items (item+)>

<!ELEMENT item (id, name, quantity)>

<!ELEMENT id (#PCDATA)>

<!ELEMENT name (#PCDATA)>

<!ELEMENT quantity (#PCDATA)>

<!ATTLIST order customerId CDATA #REQUIRED>

Как видно из приведенного выше примера определения DTD позволяют задавать для элементов набор дочерних элементов и число их вхождений в родительский элемент. Число вхождений определяется с помощью символов “?” (нулевое или единичное вхождение), “+” (минимум одно вхождение) и “*” (произвольное число вхождений). Если никакой символ не задан, то дочерний элемент должен быть объявлен ровно один раз. Существует также возможность задания условия «или» с помощью символа “|”:

<!ELEMENT contactInfo (phone+, fax*, (email|ICQ))>

Тип данных элемента задается с помощью атрибутов PCDATA и CDATA. PCDATA (Parsed Character DATA) – текст который будет анализироваться и обрабатываться XML-процессором. CDATA задает текст, который не будет обрабатываться при разборе документа.

Для атрибутов также существует возможность задания обязательности вхождения с помощью атрибутов REQUIRED (обязательный атрибут) и IMPLIED (необязательный атрибут). Можно также задавать значение атрибута по умолчанию, фиксировать значение атрибута или задавать список возможных значений. В приведенном ниже примере определяется список атрибутов элемента «заказ», состоящий из обязательного идентификатора заказчика и статуса заказа, который может принимать одно из трех значений:

<!ATTLIST order

customerId CDATA #REQUIRED

status (поступил|обрабатывается|оплачен) "поступил">

Определения DTD просты для понимания и использования. Все дочерние элементы и атрибуты элементов задаются явно в виде списка, что сильно облегчает работу по их составлению. Однако существует несколько ограничений, которые не позволяют использовать определения DTD для проверки правильности документов передаваемых веб-сервисами. Вот некоторые из них:

1. DTD не поддерживает типизацию данных, что является, пожалуй, одним из главных недостатков.

2. DTD не поддерживает пространства имен, что может привести к конфликтам при обработке различных документов.

3. Все определения носят глобальный характер внутри одного документа, поэтому документ не может содержать различных элементов с одним именем.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: