Определение шаблона документа 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. Все определения носят глобальный характер внутри одного документа, поэтому документ не может содержать различных элементов с одним именем.
Дата добавления: 2015-02-28; просмотров: 844;