Описание структуры XML документа средствами DTD – Document Type Definition

DTD

Шпаргалка по DTD.

DTD – Один из способов формализованного описания схемы документа XML, сделанного на языке, понятном программе-анализатору.

В настоящее время идет отказ от использования DTD в пользу XSD (XML Schema Definition), по ряду причин:

  • DTD использует отличный от XML синтаксис.
  • Отсутствует типизация узлов.
  • Отсутствует поддержка пространств имён.

Тем не менее этот способ ещё широко применяется поскольку является более простым и удобным для описания несложных схем документов.

КОНСТРУКЦИИ DTD

Описание схемы состоит из объявлений разметки (markup declaration), начинающихся с пары символов “<!” далее идет одно из слов:

  • ELEMENT (указывает, что объявляется элемент)
  • ATTLIST (список атрибутов)
  • ENTITY (сущность)
  • NOTATION (обозначение)

объявление разметки заканчивается “>

ОБЪЯВЛЕНИЕ ТИПА ЭЛЕМЕНТА

(должен быть описан каждый элемент документа)

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

Содержимое:

  • EMPTY – пустой (например <br />)
  • ANY – любое содержимое (встречается редко)
  • (#PCDATA) – только символьные данные
  • (список имен вложенных элементов ч.з. запятую) – вложенные элементы должны следовать в документе в том порядке, в котором они перечислены в объявлении. Объявляется только один уровень вложенности. Элементы можно группировать скобками.
    Использование разделителя | между элементами указывает, что встречается один из разделенных элементов.

После элементов или скобок:

  • ? – встречается 0 или 1 раз
  • * – 0 или несколько раз
  • + – 1 или несколько раз

ОБЪЯВЛЕНИЕ АТРИБУТОВ

Атрибуты объявляются после объявления самого элемента. Все атрибуты одного элемента объявляются сразу, одним списком.

<!ATTLIST имя_элемента имя_атрибута тип свойства>

Для каждого атрибута записывается его имя, тип и признак обязательности.

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

  • CDATA – (Character set of data) строка символов
  • Список значений атрибута в скобках, перечисл чз “|”
  • ID – уникальный идентификатор
  • IDREF – идентификатор, содержащий одно из значений атрибута ID, исп в качестве ссылки на др элементы
  • IDREFS – идентификатор, содержащий набор значений атрибута типа ID, перечисленных через пробел , так же исп в качестве ссылки сразу на несколько элементов.
  • ENTITY – имя не проверяемой анализатором сущности (объявленные в том же описании DTD)
  • ENTITIES – имена не проверяемых анализатором сущностей.
  • NMTOKEN – слово, содержащее только символы, применяемые в именах (имена др элементов или атрибутов, например чтобы ссылаться на них)
  • NMTOKENS – слова, перечисленные через пробелы
  • NOTATION – обозначение (обозначения, расшифрованные в описании DTD)
  • NOTATIONS – список нотаций

Признак обязательности

  • Значение атрибута по умолчанию – указывается в кавычках и обозначает что атрибут необязателен.
  • #REQUIRED – атрибут надо обязательно записывать в элементе.
  • #IMPLIED – атрибут необязателен, у него нет значения по умолчанию.
  • #FIXED – у атрибута есть только одно значение, кот записывается тут же через пробел.

При исп пространства имен надо всегда указывать уточненное (QName), а не локальное имя.

Атрибуты не входят в пространство имен по умолчанию.

Атрибуты “xml:lang” и “xml:space” так же дол быть объявлены в DTD в случае их применения

ОБЪЯВЛЕНИЕ СУЩНОСТЕЙ

(начинаются с “&”, а заканчиваются “;”)

Внутренние сущности – задаются при объявлении сущности.

<!ENTITY имя_сущности “сущность”> — можно применять дальше в самом DTD ниже объявления.

Внешние сущности – содержатся в отдельном файле или встроены в программу-анализатор.

<!ENTITY имя_сущности SYSTEM “URI”>

<!ENTITY имя_сущности PUBLIC “общеизвестное_объявление” “URI”>

Параметризованные сущности – исп только внутри описания DTD

<!ENTITY % имя_сущности “сущность”>

Ссылка на параметризированную сущность начинается не с “&”, а с “%” !

Сущности делятся на разбираемые(parsed) и не разбираемые (unparsed). Разбираемые предст собой фрагмент документа XML или целый документ и подлежат обработке программой-анализатором после подстановки. После подстановки разборки сущность становится частью XML документа.

Двоичный программный код, чертеж, изображение и др. не надо обрабатывать средствами XML, для этого сущность надо объявить не разбираемой . Для этого в конце объявления сущности делается пометка “NDATA” и указывается обозначение (notation) вставляемого объекта.

<!ENTITY file_pic SYSTEM "file.jpg" NDATA jpg>

ПРЕДОПРЕДЕЛЕННЫЕ СУЩНОСТИ В XML

<!ENTITY lt "&#38;#60;">
<!ENTITY gt "&#62;">
<!ENTITY amp "&#38;#38;">
<!ENTITY apos "&#39;">
<!ENTITY quot "&#34;">

ОБЪЯВЛЕНИЕ ОБОЗНАЧЕНИЯ (NOTATION)

Объявляются подобно сущностям, также могут быть внутренними и внешними.

Внутренняя

<!NOTATION имя_обозначения “расшифровка”>

Внешняя

SYSTEM | PUBLIC — в данном случае равнозначны т.к. в public не обязательно общеизвестная ссылка.

РАЗМЕЩЕНИЕ DTD

Либо в отдельном файле “*.dtd” указав его имя в кавычках во второй части пролога DOCTYPE, либо включить описание непосредственно во вторую часть пролога, заключив его в квадратные скобки.

<!DOCTYPE root_element SYSTEM "schema.dtd">

<?xml version="1.0" standalone="yes" ?>
<!DOCTYPE foo [
  <!ELEMENT foo (#PCDATA)>
]>

<foo>
бла
</foo>

Михаил Миронов

Живу в Нижнем Новгороде, работаю программистом с 2017 года, основная специализация Java, но также хорошо знаю PHP, Python, XML, HTML/CSS.

Добавить комментарий