Документация / 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
| DTD | XSD | |
|---|---|---|
| Синтаксис | Свой, не XML | XML |
| Типы данных | Нет (текст, ID, перечисления у атрибутов) | Десятки встроенных типов, свои ограничения |
| Пространства имён | Не поддерживаются | Поддерживаются |
| Сущности | Есть | Нет |
| Наследование, повторное использование | Только через параметрические сущности | Типы, группы, include/import |
Похожие инструменты
Обновлено: 30 сентября 2026 г.
