DTD – это язык описания, который позволяет нам определить, какие элементы должны быть в XML-документе, сколько раз они должны повторяться, какие атрибуты должны быть у этих элементов, какие атрибуты обязательные и какие не обязательные, а также какие сущности могут использоваться в документе. Если говорить кратко, то DTD в XML используется для проверки грамматики документа и соответствия его стандарту. То есть, проходит валидация XML-документа.
Необходимость проверки грамматики XML-документов заключается в следующем:
· XML-документ может быть предназначен не для используемой системы.
· XML-документ может содержать неправильные данные.
· XML-документ может содержать ошибки в структуре
Недостатки XML DTD
· Отличный от XML синтаксис языка.
· Нет проверки типов данных. В DTD есть только один тип – строка.
· В DTD нет пространств имен.
Описание во внешнем файле:
<?xml version="1.0" standalone="yes" ?>
<! DOCTYPE journal SYSTEM "journal.dtd">
Внутри документа:
<! DOCTYPE journal [<!ELEMENT journal (contacts, issues, authors)>...]>
Ключевое слово ELEMENT указывает, что данной инструкцией будет описываться элемент XML. Внутри этой инструкции задается название элемента(flower) и тип его содержимого. Последовательность дочерних для текущего элемента объектов задается в виде списка разделенных запятыми названий элементов. При этом для того, чтобы указать количество повторений включений этих элементов могут использоваться символы +,*, ? :
<!ELEMENT issue (title, author+, table-of-contents?)>
title - обязательный, 1раз; + - несколько раз; ? - может отсутствовать; "|" - или; * - или несколько раз или отсутствует.
<!ELEMENT flower (PCDATA | title )*>
Пример корректного XML- документа:
<?xml version=«1.0"?>
<! DOCTYPE journal [ <!ELEMENT contacts (address, tel+, email?)>
<!ELEMENT address (street, appt)>
<!ELEMENT street PCDATA>
<!ELEMENT appt (PCDATA | EMPTY)*>
<!ELEMENT tel PCDATA>
<!ELEMENT email PCDATA> ]>
<contacts>
<address>
<street>Marks avenue</street>
<appt id="4">
</address>
<tel>12-12-12</tel>
<tel>46-23-62</tel>
<email>info@j.com</email>
</contacts>