Dtd файл что это

Обновлено: 18.05.2024

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

В этой главе мы покажем, как правильно читать, разбирать и создавать DTD. Вы узнаете, как определить, когда необходимо внешнее DTD, и когда — внутреннее DTD. Мы исследуем, почему иногда предпочтительнее пользоваться заранее определенными DTD. Создание DTD является первым шагом в правильном структурировании XML-документов. Именно DTD обеспечивают XML-анализатор информацией, которая ему необходима для выполнения своей работы.

DTD определяет части документа и указывает, каким образом они могут использоваться, что может быть в них размещено, и требуются ли им фрагменты документа. DTD представляет собой набор правил, определяющий инструкции, которые могут быть переданы анализатору (parser) для обработки им этого документа. DTD может включать в себя набор объявлений элементов и атрибутов, а также сущности (entities), условные обозначения (notations) и комментарии. Различные объявления компонентов определяют, как документ будет структурирован, и эта информация (в виде инструкций) передается анализатору (parser). Анализатор, в свою очередь, отправляет результаты в приложение, обеспечивающее просмотр данных.

На примере DTD, созданного для относительно простого документа, рассмотрим, что оно собой представляет и как работает. Это пример внутреннего DTD, то есть такого, которое содержится непосредственно в самом XML-документе:

Обратите внимание, что данное DTD целиком размещено в самом документе. Эти определения, которые в действительности являются ничем иным как инструкциями по обработке данных, точно указывают анализатору XML, как именно следует управлять различными данными, которые будут размещены в документе, а также какой информацией или текстом должны быть замещены расположенные в документе сущности. DTD, который включен в состав самого XML-документа, называется внутренним подмножеством DTD (internal DTD subset), поскольку все инструкции по обработке информации, а также сами данные документа расположены внутри единого документа.

После того как предыдущий пример будет обработан анализатором и отображен браузером на экране, результат может быть следующим (предполагается, что соответствующая таблица стилей уже подключена):

Today's Memo Памятка на сегодня
August 1, 2000 1 августа 2000 г.
200 West 34th Suite 953, Anchorage. 200 West 34th Suite 953, Anchorage.
This memo is to alert you to the Это — извещение о том, что
new XML Black Book has now been издательство Coriolis, в серии
printed. Published by The Coriolis Black Book, выпустило новую книгу
Group, this book outlines пo XML, которая содержит все
everything you need to know необходимые сведения об этом языке
about XML. разметки.

Анализатор XML сверяет разметку документа по объявлениям различных элементов. Он также осуществляет замещение сущности, для которой в DTD было определено конкретное значение. В данном примере анализатор заменяет ссылку на сущность &PUBLISHER;- объявленным значением этой сущности, т. е. — The Coriolis Group. Таблица стилей, которая будет описана позднее в отдельном HTML-файле, управляет отображением данных.

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

Объявления

Объявлением называют разметку, которая служит для процессора XML специальной инструкцией, указывающей, как он должен обрабатывать данный документ. Существуют объявления элементов, атрибутов, сущностей, условных обозначений, объявление процессора и объявление типа документа. Рассмотрим два самых важных из них — объявление процессора и объявление типа документа. В отличие от остальных объявлений, объявление процессора и объявление типа документа не участвуют в конструировании самого документа. Они не поясняют структурную роль каждого отдельного элемента или атрибута. Наоборот, они указывают процессору, какой стандарт необходимо использовать, к какому типу относится обрабатываемый документ, а также где хранится DTD, в соответствии с которым сконструирован данный документ. Еще раз обратите внимание на две строки кода, которые определяют объявление процессора или так называемое объявление XML (XML declaration) и объявление типа документа:

<?XML version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE DOC [

Объявление XML

Заключительный фрагмент информации, который мы включаем в объявление XML, называется объявлением отдельного документа (standalone document declaration). Это объявление указывает, существуют ли внешние источники информации для данного документа. Так, значение "yes" говорит, что в данном документе не используется внешнее DTD или же какие-либо внешние параметрические сущности (external parameter entities). Другими словами, данный документ является самодостаточным и вся необходимая информация содержится в нем самом. Значение "yes" также указывает процессору, что в разметке необходимо игнорировать любые объявления внешних ссылок. Значение "nо" указывает процессору, что он может обрабатывать любые внешние объявления. Устанавливая для атрибута standalone значение "nо", вы сообщаете XML-процессорy, что данный документ может иметь ссылки на любые внешние объявления, например на любые внешние DTD. Это не означает, что вы должны включать внешние ссылки, а лишь то, что процессор должен принять и обработать любую внешнюю ссылку, если она указана в документе.

Когда устанавливать значение "yes", а когда "nо"? Если внешнее DTD содержит объявления атрибутов с любыми установками значений по умолчанию, и эти значения применяются по отношению к элементам, встречающимся в вашем документе, то следует установить значение "nо". Также необходимо установить значение "nо", если документ содержит какие-либо пустые участки, или в документе есть сущности, и ссылки на них встречаются в самом содержании документа. Значение "yes" можно установить, если в документе нет ссылок на внешние сущности, и если вы только используете общие сущности (general entities), являющиеся частью языка XML, например, амперсанд, символы "больше чем", "меньше чем", апостроф или же кавычки.

Объявление типа документа

Строка кода <! DOCTYPE DOC [ называется объявлением типа документа, и она служит для связи XML-документа с соответствующим DTD. Выражение, следующее за <! DOCTYPE, является именем используемого DTD. В том случае если DTD является внутренним, то за объявлением <! DOCTYPE следует список элементов и атрибутов, определенных для внутреннего DTD. Именно в объявлении типа документа автор XML-документа указывает, является ли данное DTD общим (public), или же частным (private). Далее, после закрывающей скобки указывается либо само DTD, либо локатор ссылки (reference locator)-на его местоположение. Если вы не опишете DTD, то процессор не получит информацию, необходимую для конструирования документа.

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

Вот пример DTD, содержащегося в самом документе:

Вот пример того, как DTD хранится вне документа:

<! DOCTYPE book PUBLIC "-//CompanyXYZ//DTD book//EN"
"http : / /www . s ite . com/dtds /book . dtd">

Где могут храниться DTD

DTD могут храниться как внутри самого документа, так и вне его. В данном примере мы храним DTD внутри документа:

<?XML version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE DOC [

Внутренние DTD объединяют все элементы, атрибуты, условные обозначения и сущности в самом документе. Внутренние DTD размещаются вначале документа, в объявлении типа документа. Объявление типа документа указывает процессору на DTD. Это объявление соединяет DTD с документом. Внутренние DTD указываются при помощи следующей строки кода, содержащейся в определении типа документа:

<!DOCTYPE [ Начало DTD . ]>

Внешние DTD также указываются в объявлении типа документа, но в них, в отличие от внутренних DTD, не содержатся все элементы, атрибуты, сущности, а указывается лишь внешний файл, в котором хранится сам DTD. Не требуется, чтобы имя файла внешнего DTD было аналогичным имени XML-документа, нужно чтобы у него было расширение DTD. Например, если документу присвоено имя BIZMEMO, то вы вполне можете присвоить файлу, хранящему DTD, имя MEMO.DTD. Помните, однако, что одно DTD может использоваться в нескольких документах. В этом заключается одна из наиболее мощных функциональных возможностей XML — единственное DTD может охватывать множество различных документов, основанных на общей структуре, позволяя создавать стандартизованные способы представления информации.

Общие и системные DTD

У вас есть возможность использовать как общедоступные (publicy available) DTD, которые разработаны для определенных целей, либо создать собственные DTD. Работая с общедоступными DTD, необходимо в объявлении типа документа указать ключевое имя PUBLIC. А если вы собираетесь использовать собственное DTD, то укажите ключевое слово SYSTEM. Вот пример кода для объявления общедоступного DTD:

<! DOCTYPE book PUBLIC "-//CompanyXYZ//DTD book//EN"
”http://www.site.com/dtds/book.dtd">

Посмотрим, как выглядит объявление типа документа, когда в нем указывается DTD, расположенное на локальной машине:

<! DOCTYPE book SYSTEM "http://www.site.com/dtds/book.dtd">

В этом объявлении размещается ключевое слово SYSTEM, за которым следует адрес и имя файла, в котором хранится DTD. Поскольку предполагается, что данное DTD используется лишь его владельцем, то двойные наклонные чертыы не ставятся и имя владельца DTD не указывается.

Примечание
Можно встраивать одно DTD в другое, тогда встроенное DTD вызывается внешним DTD.

Быть или не быть DTD

Как вы уже знаете, в XML применение DTD не обязательно (в отличие от SGML). Поскольку XML был изначально приспособлен для работы в World Wide Web, в нем предусмотрены случаи, когда DTD просто не может работать из-за ограничений, накладываемых пропускной способностью. В таких случаях можно включать определения элементов и атрибутов непосредственно в сам документ.

Как же узнать, когда нужно использовать DTD, а когда нет? И как узнать каким DTD должно быть — внутренним или внешним?

  • Большие документы требуют применения внешних DTD. DTD необходимы для документов большого объема. При помощи внешнего DTD вы сможете создать некоторое приближение к стандартизации, что сделает этот документ логически более последовательным, поскольку применение DTD предполагает обязательное следование определенным правилам.
  • Малые документы не требуют использования внешних DTD. Не следует создавать DTD для простой корреспонденции, например, для служебных записок и факсов размером в одну страницу.
  • В некоторых документах, предназначенных для Internet, применения внешних DTD нецелесообразно, т. к. может вызвать большую загрузку канала передачи данных.
  • XML-процессоры, не проверяющие действительность (validity) XML-документов, не требуют DTD. Если XML-процессор проверяет только, является ли XML-документ правильным (well-formed) документом, то нет необходимости применять внешнее DTD.

Итак, мы показали, в каких случаях следует использовать DTD, а в каких — нет, но фактически следует рассматривать вариант создания DTD для каждого документа и хранить это DTD отдельно от документов, для работы с которыми это DTD предназначено. Хранение DTD в отдельных файлах не только обеспечит возможность их многократного использования, но и упростит их обновление и изменение. Это также будет препятствовать случайному вмешательству в DTD.

Внешние и внутренние DTD

Приняв решение о создании DTD, следует определить способ его хранения. Размер документа — лишь один из факторов, которые следует учитывать Необходимо также тщательно рассмотреть, нужна ли проверка действительности (validity) документа.

Внутренние DTD

Первый вопрос, на который следует ответить при создании документа, можно сформулировать так: нужно ли, чтобы документ был самодостаточным (self-contained). Самодостаточный документ можно перемещать из системы в систему, без потери компонентов. С таким документом можно работать в локальной системе, без выхода в Internet, а можно поместить его сменный носитель и иметь его при себе. И любой процессор XML сможет его обработать.

Кроме того, размещение информации в едином файле снижает время загрузки, анализа, отображения и обработки файла. При размещении DTD в самом документе процессор XML для отображения информации должен прочитать один файл, а не два или три (или больше).

Наконец, применение внутреннего DTD означает, что вы создаете самодостаточный файл, который является действительным и полным. Любой процессор XML может его обработать, не прибегая к поиску файла с внешним DTD.

В XML- документах DTD определяет набор действительных элементов, идентифицирует элементы, которые могут находиться в других элементах, и определяет действительные атрибуты для каждого из них. Синтаксис DTD весьма своеобразен и от автора-разработчика требуются дополнительные усилия при создании таких документов(сложность DTD является одной из причин того, что использование SGML, требующего определение DTD для любого документа, не получило столь широкого распространения как, например, HTML). Как уже отмечалось, в XML использовать DTD не обязательно - документы, созданные без этих правил, будут правильно обрабатываться программой-анализатором, если они удовлетворяют основным требованиям синтаксиса XML. Однако контроль за типами элементов и корректностью отношений между ними в этом случае будет полностью возлагаться на автора документа. До тех пор, пока грамматика нашего нового языка не описана, его сможем использовать только мы, и для этого мы будем вынуждены применять специально разработанное программное обеспечение, а не универсальные программы-анализаторы..

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

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

Внутри же документа DTD- декларации включаются следующим образом:

В том случае, если используются одновременно внутренние и внешние описания, то программой-анализатором будут сначала рассматриваться внутренние, т.е. их приоритет выше. При проверке документа XML- процессор в первую очередь ищет DTD внутри документа. Если правила внутри документа не определены и не задан атрибут standalone ="yes" , то программа загрузит указанный внешний файл и правила, находящиеся в нем, будут считаны оттуда. Если же атрибут standalone имеет значение "yes", то использование внешних DTD описаний будет запрещено.

Определение элемента

Элемент в DTD определяется с помощью дескриптора !ELEMENT, в котором указывается название элемента и структура его содержимого.

Например, для элемента <flower> можно определить следующее правило:

Ключевое слово ELEMENT указывает, что данной инструкцией будет описываться элемент XML. Внутри этой инструкции задается название элемента(flower) и тип его содержимого.

В определении элемента мы указываем сначала название элемента(flower), а затем его модель содержимого - определяем, какие другие элементы или типы данных могут встречаться внутри него. В данном случае содержимое элемента flower будет определяться при помощи специального маркера PCDATA( что означает parseable character data - любая информация, с которой может работать программа-анализатор). Существует еще две инструкции, определяющие тип содержимого: EMPTY,ANY. Первая указывает на то, что элемент должен быть пустым(например, <red/>), вторая - на то, что содержимое элемента специально не описывается.

Последовательность дочерних для текущего элемента объектов задается в виде списка разделенных запятыми названий элементов. При этом для того, чтобы указать количество повторений включений этих элементов могут использоваться символы +,*, ? :

В этом примере указывается, что внутри элемента <issue> должны быть определены элементы title, author и table-of-contents, причем элемент title является обязательным элементом и может встречаться лишь однажды, элемент author может встречаться несколько раз, а элемент table-of-contents является опциональным, т.е. может отсутствовать. В том случае, если существует несколько возможных вариантов содержимого определяемого элемента, их следует разделять при помощи символа "|" :

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

Если в определении элемента указывается "смешанное" содержимое, т.е. текстовые данные или набор элементов, то необходимо сначала указать PCDATA, а затем разделенный символом "|" список элементов.

Пример корректного XML- документа:

Определение атрибутов

Списки атрибутов элемента определяются с помощью ключевого слова !ATTLIST. Внутри него задаются названия атрибутов, типы их значений и дополнительные параметры. Например, для элемента <article> могут быть определены следующие атрибуты:

В данном примере для элемента article определяются три атрибута: id, about и type, которые имеют типы ID(идентификатор), CDATA и список возможных значений соответственно. Всего существует шесть возможных типов значений атрибута:

  • CDATA - содержимым документа могут быть любые символьные данные
  • ID - определяет уникальный идентификатор элемента в документе
  • IDREF( IDREFS )- указывает, что значением атрибута должно выступать название(или несколько таких названий, разделенных пробелами во втором случае) уникального идентификатора определенного в этом документе элемента
  • ENTITY( ENTITIES) - значение атрибута должно быть названием(или списком названий, если используется ENTITIES) компонента (макроопределения), определенного в документе
  • NMTOKEN (NMTOKENS) - содержимым элемента может быть только одно отдельное слово(т.е. этот параметр является ограниченным вариантом CDATA)
  • Список допустимых значений - определяется список значений, которые может иметь данный атрибут.

Также в определении атрибута можно использовать следующие параметры:

Определение компонентов(макроопределений)

Компонент (entity) представляет собой определения, содержимое которых может быть повторно использовано в документе . В других языках программирования подобные элементы называются макроопределениями. Создаются DTD- компоненты при помощи инструкции !ENTITY:

Программа-анализатор, просматривая в первую очередь содержимое области DTD- определений, обработает эту инструкцию и при дальнейшем разборе документа будет использовать содержимое DTD- компонента в том месте, где будет встречаться его название. Т.е. теперь в документе мы можем использовать выражение &hello; , которое будет заменено на строчку "Мы рады приветствовать Вас"

В общем случае, внутри DTD можно задать три типа макроопределений:

Внутренние макроопределения - предназначены для определения строковой константы, с их помощью можно организовывать ссылки на часто изменяемую информацию, делая документ более читабельным. Внутренние компоненты включаются в документ при помощи амперсанта &

В XML существует пять предустановленных внутренних символьных констант:

  • &lt; - символ "<"
  • &gt; - символ ">"
  • &amp; - символ "&"
  • &apos; - символ апострофа "&apos;"
  • &quot; - символ двойной кавычки """

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

Макроопределения правил - макроопределения параметров могут использоваться только внутри области DTD и обозначаются специальным символом %, вставляемым перед названием макроса. При этом содержимое компонента будет помещено непосредственно в текст DTD- правила

Например, для следующего фрагмента документа:

можно использовать более короткую форму записи:

Макроопределения часто используются для описания параметров в правилах атрибутов. В этом случае появляется возможность использовать одинаковые определения атрибутов для различных элементов:

Типизация данных

Довольно часто при создании XML- элемента разработчику требуется определить, данные какого типа могут использоваться в качестве его содержимого. Т.е. если мы определяем элемент <last-modified>10.10.98</last-modified>, то хотим быть уверенными, что в документе в этом месте будет находиться строка, представляющая собой дату, а не число или произвольную последовательность символов. Используя типизацию данных, можно создавать элементы, значения которых могут использоваться, например, в качестве параметров SQL- запросов. Программа клиент в этом случае должна знать, к какому типу данных относится текущее значение элемента и в случае соответствия формирует SQL-запрос.

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

Задав атрибуту значение по умолчанию LONG и определив его как FIXED, мы позволили тем самым программе-клиенту получить необходимую информацию о типе содержимого данного элемента, и теперь она может самостоятельно определить соответствие типа этого содержимого указанному в DTD- определении .

Вот пример XML- документа, в котором определяются и используются несколько элементов с различными типами данных:

Как видно из примера, механизм создания элементов документа при этом нисколько не изменился. Все необходимая для проверки типов данных информация заложена в определения элементов внутри блока DTD.

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

Создавая XML документ разработчик сам решает: как назвать теги, в каком порядке они будут следовать, какие данные будут записаны в том или ином элементе, будут ли у элемента атрибуты или нет и многое другое. Без формального описания структуры документа этим самым документом может воспользоваться только его разработчик. В случае если разработанный XML документ предназначен для передачи во внешний мир, например партнерам по бизнесу, и если к тому же планируется получать в ответ документы, написанные в том же самом формате без определения типов документов ( Document Type Definition , DTD ) не обойтись. Это связано с тем, что для того, что бы обе стороны могли понимать полученную информацию элементы и атрибуты в документах должны употребляться всеми сторонами одинаково. Определения типа документа вносят строгость и точность в правила написания правильно оформленных документов XML . Хранимые в начале файла XML или внешним образом в виде файла *.DTD , определения типов документов описывают информационную структуру документа. В DTD перечисляются возможные имена элементов, определяются имеющиеся атрибуты для каждого типа элементов и описывается вложенность элементов.

XML используется в качестве средства для описания грамматики других языков. И таким образом разрабатывая некоторый язык для написания XML документов в той или иной области нам придется разработать словарь данной области деятельности. DTD по определению содержат всю информацию которая может появиться в XML документе. Все, что входит в проект, должно быть включено в DTD . Таким образом DTD описания в сущности и является таким словарем. Современный мир меняется достаточно динамично поэтому заранее не известно какая информация может потребоваться в дальнейшем и для того что бы не пришлось часто изменять структуру документов обычно разрабатываемый словарь включает в себя все что может понадобиться для конкретных видов бизнеса или промышленности. Это позволяет использовать определения DTD как средство анализа и проектирования. Приложения XML взаимодействуют друг с другом на основе словарей, которые они понимают, так что определение DTD помогает понять, что может описать приложение .

Другое применение DTD это проверка написанного XML документа на корректность . Правильно оформленные документы, написанные в соответствии со всеми правилами, описанными в спецификации XML , не могут быть проверены на предмет ошибок. Пропущенные ошибки могут вызвать повреждение программы обрабатывающей данные документы, либо ввод в систему неверных данных. Но если документ ссылается на определение DTD , то, используя проверяющий на допустимость анализатор можно проверить, есть ли в нашем документе ошибки. Анализатор затребует DTD и убедится, что документ соответствует описанным в нем грамматическим правилам. Анализатор обнаруживает структурные ошибки и ошибки содержания, что намного уменьшает объем проверок, выполняемых логикой приложения.

Написание определений DTD: общие принципы.

Ассоциирование DTD с документом XML

Для связывания декларации DTD с экземпляром документа в версии XML 1.0 предлагается специальная декларация DOCTYPE . Она должна следовать после декларации XML и предшествовать любым элементам документа. Тем не менее, между декларациями XML и DOCTYPE могут находиться комментарии и команды обработки.

Декларация DOCTYPE содержит ключевое слово DOCTYPE , за которым следует имя корневого элемента документа, а затем конструкция с декларациями содержания. Перед разъяснением этого утверждения рассмотрим пример расположения декларации DOCTYPE в экземпляре документа. Ниже приводятся первые три строчки документа XML:

Можно написать внешнее подмножество деклараций в отдельном файле DTD , включить внутреннее подмножество в тело декларации DOCTYPE или сделать то и другое. В последнем случае (смешение внутренних и внешних DTD ) во внутренних DTD могут быть заданы новые декларации или переписаны те, что содержатся во внешних (по определению спецификации XML анализаторы сначала читают внутреннее подмножество, и потому содержащиеся там декларации пользуются приоритетом).

Декларации XML могут содержать атрибут standalone, принимающий только значения "yes" и "nо". Если значение атрибута равно yes, то внешние для экземпляра документа декларации не влияют на информацию, передаваемую документом использующему его приложению. Значение no показывает, что существуют внешние декларации со значениями, необходимыми для правильного описания содержания документа - например конкретные значения по умолчанию. На практике необязательный атрибут standalone используется редко. Наличие этого атрибута со значением, yes не гарантирует отсутствия внешних зависимостей любого типа. Просто внешние зависимости в этом случае не приведут к ошибке в документе, если не будут включены в обработку. Таким образом, в основном этот атрибут представляет собой знак для анализаторов и других приложений, показывающий, нужно ли им использовать какое-либо внешнее содержание.

Блок внутренней декларации разметки тега DOCTYPE состоит из левой квадратной скобки, списка деклараций и правой квадратной скобки:

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

Внешние DTD в некоторых отношениях более гибкие. В данном случае декларация DOCTYPE состоит из обычного ключевого слова и имени корневого элемента, за которым следует еще одно ключевое слово SYSTEM либо PUBLIC , обозначающее источник внешнего определения DTD , а за ним - локализация этого определения. Если ключевое слово SYSTEM , DTD обязано непосредственно и явным образом находится по указанному URL адресу.

Если внешние DTD переписываются очень часто, они начинают терять свое значение, а это признак плохого первоначального проекта.

Ключевое слова PUBLIC предназначено для хорошо известных словарей. Приложение, анализирующее документ из этого словаря, должно использовать некоторую стратегию по поиску соответствующего DTD .

Стандарт XML 1.0 допускает у декларации PUBLIC наличие как публичного URI , так и системного идентификатора. Если работающее с документом приложение или анализатор не могут найти DTD по идентификатору URI с ключевым словом PUBLIC , оно должно использовать системный идентификатор.

Основные декларации разметки

Допустимое в документе XML содержание определяется с помощью четырех типов декларации разметки в DTD . В следующей далее таблице показаны связанные с этими декларациями ключевые слова и их значения:

Первые два типа связаны с информацией, которую мы рассчитываем найти в документе XML, - элементами и атрибутами.

Последние два типа используются для поддержки. Особенно облегчают жизнь разработчика словаря XML сущности. Как правило, они состоят из содержания, которое настолько часто используется в DTD или документе, что оправдывает создание специальной декларации. Применение этой декларации напоминает оператор include в языках C/C++ , когда в качестве замены для содержания используется имя.

Нотации описывают содержание, разработанное не на языке XML. Используются они для того, чтобы объявить конкретный класс данных и связать его с внешней программой. Эта внешняя программа становится обработчиком объявленного класса данных. Например, связав с документом изображение в формате JPEG, разработчик желает, чтобы программа приняла и визуализировала двоичные данные в этом формате. Конечно, в таком случае документ зависит от того, какой обработчик имеется в системе, получающей документ. В интересах портативности и переносимости некоторые авторы не приводят ссылки на обработчики. В таком случае нотация превращается просто в механизм набора текста.

Объявление элементов.

Каждый элемент документа XML должен быть описан. Объявление элемента начинается с символов <!ELEMENT , после которых через пробел идет имя элемента и его содержимое. Заканчивается объявление символом "больше". По своему содержанию элементы делятся на четыре группы.

Это очередная статья в цикле «Основы XML» и в ней мы рассмотрим основы описания структуры XML данных при помощи DTD. Это довольно таки старый способ описания структуры XML-документов, но он до сих пор используется, поэтому мы его все же рассмотрим.

Также хочу отметить, что это отличный способ показать, как в XML идет проверка содержимого документа, его грамматики и т.д. Более новый и совершенный способ описания структуры XML-документов с использованием технологии XML Schema мы рассмотрим в следующей статье, ну а пока перейдем непосредственно к изучению DTD XML.

В рамках данной статьи мы рассмотрим сразу несколько важных моментов. Это что такое XML DTD и для чего он нужен, поговорим о недостатках DTD, а также научимся самостоятельно составлять собственный DTD для валидации XML-документов. Все это, как обычно, будет изложено пошагово, максимально кратко и понятно с целью экономии вашего времени.

Что такое DTD в XML и для чего он нужен

DTD – это язык описания, который позволяет нам определить, какие элементы должны быть в XML-документе, сколько раз они должны повторяться, какие атрибуты должны быть у этих элементов, какие атрибуты обязательные и какие не обязательные, а также какие сущности могут использоваться в документе. Подробнее про конструкции XML читайте в статье «Элементы, теги и атрибуты XML».

Если говорить кратко, то DTD в XML используется для проверки грамматики документа и соответствия его стандарту (тому, который придумал разработчик или вы сами). Это позволяет парсеру (обработчику) на этапе обработки определить, соответствует ли документ нашим требованиям. То есть, проходит валидация XML-документа.

Необходимость проверки грамматики XML-документов заключается в следующем:

  • XML-документ может быть предназначен не для вашей системы.
  • XML-документ может содержать неправильные данные.
  • XML-документ может содержать ошибки в структуре (Разметка и структура XML документов).

Итак, мы разобрались с тем, что такое XML DTD и зачем он нужен. Теперь давайте кратко рассмотрим недостатки DTD, после чего перейдем непосредственно к рассмотрению процесса создания DTD файлов для валидации XML-документов.

Недостатки XML DTD

  • Отличный от XML синтаксис языка. Это вызывает множество проблем, таких как, например, проблемы с кодировкой или невозможность отслеживать ошибки.
  • Нет проверки типов данных. В DTD есть только один тип – строка.
  • В DTD нет пространств имен. Нельзя поставить в соответствие документу два и более DTD описаний.

Это был краткий список недостатков DTD, которые с успехом исправлены в XML схемах, о которых мы поговорим в следующих статьях.

Объявление элементов, атрибутов и сущностей в DTD. Модификаторы «*», «?», «+»

Для объявления элементов, атрибутов и сущностей в DTD используются специальные декларации и модификаторы. Чтобы подробно во всем разобраться, давайте для начала рассмотрим теоритическую информацию, а затем во второй части статьи перейдем к практическим примерам.

Определение элемента XML и последовательности элементов XML

Элемент book содержит по одному элементу title, author, price и description.

Альтернативы элементов

Элемент pricelist содержит элементы title, price и один элемент из трех на выбор – author, company либо sample.

Пустые элементы

Элемент none должен быть пустым.

Объявление атрибута

Определение сущностей

Если встретится сущность «&myname;», то вместо нее автоматически подставится «Дмитрий Денисов».

Модификаторы (объясняют повторения элементов)

Элемент books может содержать один или более элементов book.

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

Создание DTD-файла для валидации XML-документа на примере прайс-листа книг

Пусть у нас будет все тот же прайс-лист книг, который мы используем для примеров практически в каждой статье про XML. Сам XML-документ будет выглядеть примерно следующим образом.

Конечно, вышеприведенный пример не является пределом мечтаний, но для примера вполне сойдет. Как видно с примера, у нас есть корневой элемент pricelist, который содержит вложенные элементы book. Внутри элементов book находятся элементы title, author, price и возможно description, которые могут содержать какие-то текстовые данные.

Для валидации данного прайс-листа мы можем использовать DTD-документ следующего содержания.

Теперь разберем все более подробно.

Подключение DTD для валидации XML-документов

Декларативный способ

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

где вместо DOCUMENT указываем корневой элемент XML-документа.

Для наглядности рассмотрим пример готового самодостаточного документа с декларативным способом включения DTD.

Суть данного метода состоит в том, чтобы подключить к XML-документу файл DTD при помощи следующей конструкции.

где DOCUMENT – указываем корневой элемент XML-документа.
file.dtd – ссылка на файл DTD.

Для наглядности рассмотрим следующий пример.

На этом данная статья подошла к концу. Все основные моменты при работе с XML DTD мы рассмотрели и, надеюсь, у меня получилось понятно все объяснить. Если вы не хотите пропустить выпуска других уроков по XML и XSLT, рекомендую подписаться на новостную рассылку, воспользовавшись формой ниже.

Читайте также: