Открыть сервис

Document Type Definition

Document Type Definition (DTD, рус. «Определение типа документа») — это набор правил, который описывает структуру, состав и допустимые значения элементов и атрибутов для определённого класса документов, размеченных с помощью SGML (Standard Generalized Markup Language) или XML (Extensible Markup Language). DTD определяет, какие элементы могут встречаться в документе, в каком порядке, сколько раз, какие атрибуты им разрешены и какие значения эти атрибуты могут принимать. Фактически, DTD выступает грамматикой для конкретного формата данных, обеспечивая возможность формальной валидации документа на соответствие заданному типу. DTD может быть включён непосредственно в документ (внутреннее DTD) или храниться в отдельном файле (внешнее DTD), на который документ ссылается.

История

Концепция DTD восходит к языку SGML, разработанному в 1960–1980-х годах. Первым стандартом, определившим синтаксис DTD, стал ISO 8879:1986 (SGML). В этом стандарте DTD было неотъемлемой частью SGML-документа, поскольку без DTD невозможно было однозначно интерпретировать разметку. С появлением XML в 1998 году (рекомендация W3C) DTD было включено в спецификацию XML как один из способов задания структуры документа. Однако в XML DTD стало опциональным: документ может быть как «правильно построенным» (well-formed) без DTD, так и «валидным» (valid) при его наличии.

С развитием веб-технологий и ростом сложности XML-схем DTD постепенно уступило место более мощным и гибким альтернативам, таким как XML Schema (XSD) и RELAX NG. Тем не менее DTD остаётся широко используемым в унаследованных системах, в форматах, основанных на SGML (например, DocBook, TEI), и в некоторых веб-стандартах (например, XHTML 1.0 использует DTD).

Синтаксис и структура

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

Декларации элементов

Декларация элемента задаёт его имя и модель содержимого. Модель содержимого определяет, какие дочерние элементы и в каком порядке могут находиться внутри данного элемента, а также может ли элемент содержать текст (#PCDATA). Синтаксис:

`` <!ELEMENT имя_элемента модель_содержимого> ``

Примеры моделей содержимого:

Пример:

`` <!ELEMENT книга (название, автор?, глава+)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> <!ELEMENT глава (заголовок, параграф*)> <!ELEMENT заголовок (#PCDATA)> <!ELEMENT параграф (#PCDATA)> ``

Декларации атрибутов

Декларация атрибута задаёт для элемента список атрибутов, их тип и значение по умолчанию. Синтаксис:

`` <!ATTLIST имя_элемента имя_атрибута тип_атрибута значение_по_умолчанию ...> ``

Типы атрибутов:

Значения по умолчанию:

Пример:

``` <!ATTLIST книга isbn CDATA #REQUIRED жанр (фантастика | детектив | роман) "роман" id ID #IMPLIED

```

Декларации сущностей

Сущности в DTD — это макросы, которые позволяют вставлять повторяющиеся фрагменты текста или символы. Различают внутренние и внешние сущности.

Внутренняя сущность:

`` <!ENTITY имя "значение"> ``

Пример:

`` <!ENTITY copyright "© 2024"> ``

Внешняя сущность:

`` <!ENTITY имя SYSTEM "URI"> ``

Пример:

`` <!ENTITY введение SYSTEM "intro.xml"> ``

Параметрические сущности (используются только внутри DTD) объявляются с символом %:

`` <!ENTITY % общие-атрибуты "id ID #IMPLIED lang CDATA #IMPLIED"> <!ATTLIST книга %общие-атрибуты;> ``

Декларации нотаций

Нотации описывают тип внешнего содержимого (например, двоичные данные), на которое ссылается документ. Синтаксис:

`` <!NOTATION имя SYSTEM "системный_идентификатор"> ``

Пример:

`` <!NOTATION gif SYSTEM "image/gif"> ``

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

Внутреннее DTD

Внутреннее DTD включается непосредственно в документ с помощью конструкции <!DOCTYPE ... [ ... ]>:

``xml <?xml version="1.0"?> <!DOCTYPE книга [ <!ELEMENT книга (название, автор)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> ]> <книга> <название>Война и мир</название> <автор>Лев Толстой</автор> </книга> ``

Внешнее DTD

Внешнее DTD хранится в отдельном файле и подключается через ссылку:

``xml <?xml version="1.0"?> <!DOCTYPE книга SYSTEM "book.dtd"> <книга> <название>Война и мир</название> <автор>Лев Толстой</автор> </книга> ``

Файл book.dtd:

`` <!ELEMENT книга (название, автор)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> ``

Применение

Валидация документов

Основное назначение DTD — обеспечение формальной валидации. Парсер, поддерживающий DTD, может проверить, соответствует ли документ заданным правилам. Если документ не соответствует DTD, он считается невалидным. Это важно для обмена данными между системами, где требуется строгое соблюдение формата.

Форматы на основе SGML

Многие классические форматы, такие как DocBook (для технической документации), TEI (для гуманитарных наук), HTML (до HTML5) и XHTML 1.0, используют DTD. Например, XHTML 1.0 Strict имеет официальное DTD, которое определяет все допустимые элементы и атрибуты.

Унаследованные системы

В корпоративных и государственных информационных системах, разработанных в 1990–2000-х годах, часто используются DTD. Миграция на более современные схемы (XSD) требует значительных усилий, поэтому DTD продолжают эксплуатироваться.

Простота и компактность

DTD имеет более простой синтаксис по сравнению с XSD и не требует изучения пространств имён XML. Для небольших и простых схем DTD может быть предпочтительнее из-за меньшего объёма кода.

Ограничения и критика

Несмотря на широкое распространение, DTD имеет ряд недостатков:

Альтернативы

Основные альтернативы DTD:

Пример полного DTD

Ниже приведён пример DTD для простого каталога книг:

``` <!ELEMENT каталог (книга+)> <!ELEMENT книга (название, автор, год?, цена)> <!ELEMENT название (#PCDATA)> <!ELEMENT автор (#PCDATA)> <!ELEMENT год (#PCDATA)> <!ELEMENT цена (#PCDATA)> <!ATTLIST книга isbn CDATA #REQUIRED жанр (фантастика | детектив | роман) "роман"

```

Соответствующий XML-документ:

``xml <?xml version="1.0"?> <!DOCTYPE каталог SYSTEM "catalog.dtd"> <каталог> <книга isbn="978-5-699-12345-6" жанр="роман"> <название>Война и мир</название> <автор>Лев Толстой</автор> <год>1869</год> <цена>500</цена> </книга> </каталог> ``

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →