Документация / XML

DTD

DTD (Document Type Definition) — встроенный в XML способ описать формат документа: какие элементы и атрибуты допустимы и как они вкладываются. DTD проще и старше XSD: в нём нет типов данных (кроме нескольких типов атрибутов) и пространств имён. Сейчас для описания форматов обычно используют XSD, но DTD встречается в старых форматах и конфигурациях, а объявления сущностей — во многих документах.

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

DTD подключается объявлением <!DOCTYPE корень …> в прологе. Объявления могут быть:

  • во внутреннем подмножестве — в квадратных скобках внутри DOCTYPE;
  • во внешнем подмножестве — в отдельном файле: SYSTEM "адрес" или PUBLIC "идентификатор" "адрес".
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
  <!ELEMENT note (to, from, subject?, body)>
  <!ELEMENT to (#PCDATA)>
  <!ELEMENT from (#PCDATA)>
  <!ELEMENT subject (#PCDATA)>
  <!ELEMENT body (#PCDATA | b)*>
  <!ELEMENT b (#PCDATA)>
  <!ATTLIST note priority (low | normal | high) "normal">
  <!ENTITY company "ООО «Ромашка»">
]>
<note priority="high">
  <to>Иван</to>
  <from>&company;</from>
  <body>Счёт нужно оплатить <b>до пятницы</b>.</body>
</note>

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

<!ELEMENT имя модель>, где модель:

МодельЗначение
EMPTYЭлемент всегда пустой
ANYЛюбое содержимое
(#PCDATA)Только текст
(a, b, c)Последовательность элементов в этом порядке
(a | b)Один из элементов
(#PCDATA | a | b)*Смешанное содержимое: текст и элементы в любом порядке

Количество задают суффиксами: ? — ноль или один, * — ноль или больше, + — один или больше; без суффикса — ровно один.

<!ELEMENT order (customer, item+, comment?)>
<!ELEMENT customer (#PCDATA)>
<!ELEMENT item (#PCDATA)>
<!ELEMENT comment (#PCDATA)>

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

<!ATTLIST элемент имя тип значение-по-умолчанию …>:

ТипЗначение
CDATAЛюбой текст
(a | b | c)Перечисление
IDУникальный идентификатор в документе
IDREF, IDREFSСсылка (ссылки) на ID
NMTOKEN, NMTOKENSИмя-токен (буквы, цифры, -, ., _, :)
ENTITY, ENTITIESИмя неразбираемой сущности
NOTATION (…)Имя нотации
Значение по умолчаниюСмысл
#REQUIREDАтрибут обязателен
#IMPLIEDНеобязателен, значения по умолчанию нет
#FIXED "значение"Всегда это значение
"значение"Значение по умолчанию
<!ELEMENT item (#PCDATA)>
<!ATTLIST item
  sku      ID       #REQUIRED
  quantity CDATA    "1"
  unit     (pcs | kg) "pcs">

Сущности

  • Общие внутренние — текстовые подстановки: <!ENTITY company "ООО «Ромашка»">, используются как &company;.
  • Общие внешние — содержимое из файла: <!ENTITY terms SYSTEM "terms.xml">.
  • Параметрические — только внутри DTD, для сокращения объявлений: <!ENTITY % text "(#PCDATA)"> и %text;.
  • Неразбираемые — ссылка на двоичные данные с нотацией: <!ENTITY logo SYSTEM "logo.png" NDATA png>.

Безопасность. Внешние сущности и глубоко вложенные подстановки используются в атаках (XXE, «миллиард смехов»). Процессоры, которые принимают XML извне, должны отключать загрузку внешних сущностей и ограничивать раскрытие сущностей. Редактор «Помощника SA» внешние сущности не загружает.

Условные секции

Во внешнем DTD можно включать и выключать фрагменты: <![INCLUDE[ … ]]> и <![IGNORE[ … ]]> — обычно через параметрическую сущность со значением INCLUDE или IGNORE.

DTD или XSD

DTDXSD
СинтаксисСвой, не XMLXML
Типы данныхНет (текст, ID, перечисления у атрибутов)Десятки встроенных типов, свои ограничения
Пространства имёнНе поддерживаютсяПоддерживаются
СущностиЕстьНет
Наследование, повторное использованиеТолько через параметрические сущностиТипы, группы, include/import

Обновлено: 30 сентября 2026 г.