Dtd что это – XML DTD — проверка грамматики XML-документов (валидация) при помощи DTD

Содержание

DTD — это… Что такое DTD?

DTD (англ. Document Type Definition определение типа документа) — включает в себя два понятия:

  • Термин, который используется для описания схемы документа или его части языком схем DTD.
  • Язык схем DTD (DTD schema language) — искусственный язык, который используется для записи фактических синтаксических правил метаязыков разметки текста SGML и XML. С момента его внедрения другие языки схем для спецификаций, такие как XML Schema и RELAX NG, выпускаются с дополнительной функциональностью.

Из-за определённых отличий между XML и SGML, применение DTD также имеет некоторые особенности в зависимости от целевого документа

Сейчас идёт отказ от использования DTD в XML-технологии по ряду причин:

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

На смену DTD пришёл стандарт консорциума W3C XML Schema.

Описание схемы документа

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

Объявление объектов-параметров

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

Примеры:

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

Объект-параметр fontstyle содержит в себе группу тегов TT | I | B | BIG | SMALL.

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

Объект-параметр inline содержит в себе текстовые данные и ещё четыре объекта-параметра fontstyle, phrase, special и formctrl.

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

Объявления элементов образовывают перечень разрешенных названий элементов в документе, а также определяют информацию относительно тегов (являются ли они обязательными) и модели содержимого для каждого элемента.

Различные ключевые слова и символы определяют содержимое элемента:

  • EMPTY — пустое содержимое
  • ANY — любое содержимое
  • , — указывает порядок
  • | — разделение альтернатив
  • () — группировка
  • * — любое количество элементов (ноль и более)
  • + — по крайней мере один элемент (один и более)
  •  ? — необязательное наличие элемента (ноль или один)
  • Если нет *, + или ? — элемент должен быть только один

Примеры:

<!ELEMENT DL - - (DT|DD)+>

Элемент DL должен содержать один и более элементов DT или DD в произвольном порядке.

<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>

Элемент FORM должен содержать в себе один или более элементов с объектом-параметром block или элементы SCRIPT в произвольном порядке, однако исключена возможность содержать ещё один элемент FORM.

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

С каждым элементом DTD-документа можно сопоставить список атрибутов. Для этого используется директива !ATTLIST, в которой указываются имя элемента, с которым может быть сопоставлен список атрибутов и параметры каждого атрибута: его имя, тип и свойства по умолчанию.

Например:

<!ATTLIST MAP name CDATA #REQUIRED>

В этом примере определен атрибут name для элемента MAP. Он является обязательным.

Существуют такие типы атрибутов:

  • CDATA (Character set of data) — значением атрибута могут быть любые символьные данные
  • ID — значением атрибута должен быть уникальный идентификатор элемента
  • IDREF — значением элемента является ссылка на элемент по его ID
  • IDREFS — тоже что и IDREF, но с возможностью ссылок не по одному идентификатору, а по нескольким
  • NMTOKEN — значением атрибута может быть последовательность символов, в чём-то схожая с именем (отсюда и названием — name token). Это строка, которая содержит любую комбинацию тех символов, которые разрешено использовать для имен XML.
  • NMTOKENS — значением атрибута является список значений
  • ENTITY — значение используется для ссылки на внешнюю сущность.
  • ENTITIES — позволяет задать список внешних сущностей, разделённых пробелами.
  • NOTATION — значением атрибута может быть одна из ранее определённых нотаций
  • NOTATIONS — позволяет задать список нотаций.
  • Listings и NOTATION-listings
  • ENUMERATION — задаёт список возможных альтернатив значений.

Существуют такие свойства по умолчанию:

  1. IMPLIED — значение атрибута указывать не обязательно;
  2. REQUIRED — значение атрибута обязательно должно быть указано;
  3. FIXED — значение этого атрибута задано как константа в DTD и в документе не может быть изменено;
  4. некоторое конкретное значение, которое используется по умолчанию.

Связь документа с определённым DTD

Чтобы связать документ с определённым DTD, необходимо в начале текста документа указать элемент Объявление Типа Документа.

В зависимости от места расположения DTD, Объявление Типа Документа может быть двух видов:

  • Внутреннее подмножество DTD

Набор объявлений DTD содержится в самом тексте документа. Например:

<!DOCTYPE foo [ <!ENTITY greeting "helloworld"> ]>
 
<!DOCTYPE bar [ <!ENTITY greeting "helloworld"> ]>
  • Внешнее подмножество DTD

Набор объявлений DTD располагается в отдельном текстовом файле с расширением .dtd В этом случае ссылку на файл можно сделать через публичный идентификатор и (или) через системный идентификатор. Например:

<!-- Валидация простого HTML 4.01 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

</source>

Пример

Пример очень простого XML DTD, описывающего список людей:

<!ELEMENT people_list (person*)>
<!ELEMENT person (name, birthdate?, gender?, socialsecuritynumber?)>
<!ELEMENT name (#PCDATA) >
<!ELEMENT birthdate (#PCDATA) >
<!ELEMENT gender (#PCDATA) >
<!ELEMENT socialsecuritynumber (#PCDATA) >

Начиная с первой строки:

  1. Элемент <people_list> содержит любое число элементов <person> . Знак <*> означает что возможно 0, 1 или более элементов <person>
    внутри элемента <people_list>.
  2. Элемент <person> содержит элементы <name>, <birthdate>, <gender> и <socialsecuritynumber>. Знак <?> означает что элемент необязателен. Элемент <name> не содержит <?>, что означает что элемент <person> обязательно должен содержать элемент <name>.
  3. Элемент <name> содержит данные.
  4. Элемент <birthdate> содержит данные.
  5. Элемент <gender> содержит данные.
  6. Элемент <socialsecuritynumber> содержит данные.

Пример XML-документа, использующего этот DTD:

<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE people_list SYSTEM "example.dtd">
<people_list>
    <person>
        <name>Fred Bloggs</name>
        <birthdate>27/11/2008</birthdate>
        <gender>Male</gender>
        <socialsecuritynumber>1234567890</socialsecuritynumber>
    </person>
</people_list>

См. также

dic.academic.ru

DTD — Википедия. Что такое DTD

DTD (англ. Document Type Definition — определение типа документа) — включает в себя два понятия:

  • Термин, который используется для описания схемы документа или его части языком схем DTD.
  • Язык схем DTD (DTD schema language) — компьютерный язык, который используется для записи фактических синтаксических правил метаязыков разметки текста SGML и XML. С момента его внедрения другие языки схем для спецификаций, такие как XML Schema и RELAX NG, выпускаются с дополнительной функциональностью.

Из-за определённых различий между XML и SGML применение DTD также имеет некоторые особенности в зависимости от целевого документа.

Сейчас идёт отказ от использования DTD в XML-технологии по ряду причин:

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

На смену DTD пришёл стандарт консорциума W3C XML Schema.

Описание схемы документа

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

Объявление объектов-параметров

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

Примеры:

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

Объект-параметр fontstyle содержит в себе группу тегов TT | I | B | BIG | SMALL.

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

Объект-параметр inline содержит в себе текстовые данные и ещё четыре объекта-параметра fontstyle, phrase, special и formctrl.

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

Объявления элементов образовывают перечень разрешённых названий элементов в документе, а также определяют информацию относительно тегов (являются ли они обязательными) и модели содержимого для каждого элемента.

Различные ключевые слова и символы определяют содержимое элемента:

  • EMPTY — пустое содержимое
  • ANY — любое содержимое
  • , — указывает порядок
  • | — разделение альтернатив
  • () — группировка
  • * — любое количество элементов (ноль и более)
  • + — по крайней мере один элемент (один и более)
  • ? — необязательное наличие элемента (ноль или один)
  • Если нет *, + или ? — элемент должен быть только один

Примеры:

<!ELEMENT DL - - (DT|DD)+>

Элемент DL должен содержать один и более элементов DT или DD в произвольном порядке.

<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>

Элемент FORM должен содержать в себе один или более элементов с объектом-параметром block или элементы SCRIPT в произвольном порядке, однако исключена возможность содержать ещё один элемент FORM.

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

С каждым элементом DTD-документа можно сопоставить список атрибутов. Для этого используется директива !ATTLIST, в которой указываются имя элемента, с которым может быть сопоставлен список атрибутов и параметры каждого атрибута: его имя, тип и свойства по умолчанию.

Например:

<!ATTLIST MAP name CDATA #REQUIRED>

В этом примере определен атрибут name для элемента MAP. Он является обязательным.

Существуют такие типы атрибутов:

  • CDATA (Character set of data) — значением атрибута могут быть любые символьные данные
  • ID — значением атрибута должен быть уникальный идентификатор элемента
  • IDREF — значением элемента является ссылка на элемент по его ID
  • IDREFS — тоже что и IDREF, но с возможностью ссылок не по одному идентификатору, а по нескольким
  • NMTOKEN — значением атрибута может быть последовательность символов, в чём-то схожая с именем (отсюда и названием — name token). Это строка, которая содержит любую комбинацию тех символов, которые разрешено использовать для имен XML.
  • NMTOKENS — значением атрибута является список значений
  • ENTITY — значение используется для ссылки на внешнюю сущность.
  • ENTITIES — позволяет задать список внешних сущностей, разделённых пробелами.
  • NOTATION — значением атрибута может быть одна из ранее определённых нотаций
  • NOTATIONS — позволяет задать список нотаций.
  • Listings и NOTATION-listings
  • ENUMERATION — задаёт список возможных альтернатив значений.

Существуют такие свойства по умолчанию:

  1. IMPLIED — значение атрибута указывать не обязательно;
  2. REQUIRED — значение атрибута обязательно должно быть указано;
  3. FIXED — значение этого атрибута задано как константа в DTD и в документе не может быть изменено;
  4. некоторое конкретное значение, которое используется по умолчанию.

Связь документа с определённым DTD

Чтобы связать документ с определённым DTD, необходимо в начале текста документа указать элемент Объявление Типа Документа.

В зависимости от места расположения DTD, Объявление Типа Документа может быть двух видов:

  • Внутреннее подмножество DTD

Набор объявлений DTD содержится в самом тексте документа. Например:

<!DOCTYPE foo [ <!ENTITY greeting "helloworld"> ]>
 
<!DOCTYPE bar [ <!ENTITY greeting "helloworld"> ]>
  • Внешнее подмножество DTD

Набор объявлений DTD располагается в отдельном текстовом файле с расширением .dtd В этом случае ссылку на файл можно сделать через публичный идентификатор и (или) через системный идентификатор. Например:

<!-- Валидация простого HTML 4.01 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

Пример

Пример очень простого XML DTD, описывающего список людей:

<!ELEMENT people_list (person*)>
<!ELEMENT person (name, birthdate?, gender?, socialsecuritynumber?)>
<!ELEMENT name (#PCDATA) >
<!ELEMENT birthdate (#PCDATA) >
<!ELEMENT gender (#PCDATA) >
<!ELEMENT socialsecuritynumber (#PCDATA) >

Начиная с первой строки:

  1. Элемент <people_list> содержит любое число элементов <person> . Знак <*> означает что возможно 0, 1 или более элементов <person> внутри элемента <people_list>.
  2. Элемент <person> содержит элементы <name>, <birthdate>, <gender> и <socialsecuritynumber>. Знак <?> означает что элемент необязателен. Элемент <name> не содержит <?>, что означает что элемент <person> обязательно должен содержать элемент <name>.
  3. Элемент <name> содержит данные.
  4. Элемент <birthdate> содержит данные.
  5. Элемент <gender> содержит данные.
  6. Элемент <socialsecuritynumber> содержит данные.

Пример XML-документа, использующего этот DTD:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE people_list SYSTEM "example.dtd">
<people_list>
   <person>
      <name>
         Fred Bloggs
      </name>
      <birthdate>
         27/11/2008
      </birthdate>
      <gender>
         Male
      </gender>
      <socialsecuritynumber>
         1234567890
      </socialsecuritynumber>
   </person>
</people_list>

См. также

wiki.sc

Использование DTD для описания схемы XML документа

Шпаргалка по 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>

 

divancoder.ru

XML DTD — проверка грамматики XML-документов (валидация) при помощи DTD

Это очередная статья в цикле «Основы 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

<!ELEMENT название элемента (что может содержать)>

Пример

<!ELEMENT book (title, author, price, description)>

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

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

<!ELEMENT название элемента (элемент 1, элемент 2, (элемент 3 | элемент 4 | элемент 5))>

Пример

<!ELEMENT pricelist (title, price, (author | company | sample))>

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

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

<!ELEMENT элемент EMPTY>

Пример

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

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

<!ATTLIST элемент
атрибут 1 CDATA #REQUIRED
атрибут 2 CDATA #IMPLIED
>

Пример

<!ATTLIST pricelist
id CDATA #REQUIRED
name CDATA #IMPLIED
>

Элемент pricelist может содержать два атрибута – атрибут id и атрибут name. При этом атрибут id является обязательным, так как указано #REQUIRED, а атрибут name – не обязательным (указано #IMPLIED). В свою очередь CDATA указывает обработчику, что разбирать содержимое атрибутов не нужно.

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

<!ENTITY сущность "что подставлять">

Пример

<!ENTITY myname "Дмитрий Денисов">

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

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

* — ноль или много.
? – ноль или один.
+ — один или много.

Пример

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

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<pricelist>
<book>
<title>Книга 1</title>
<author>&myname;</author>
<price>Цена 1</price>
<description>Описание</description>
</book>
</pricelist>

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

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

<!ELEMENT pricelist (book+)>
<!ELEMENT book (title, author+, price, description?)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ENTITY myname "Дмитрий Денисов">

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

  • <!ELEMENT pricelist (book+)> — декларируем корневой элемент books и в скобках указываем, что он может содержать. В данном случае он может содержать один или более элементов book (плюсик означает один или более, см. выше).
  • <!ELEMENT book (title, author+, price, description?)> — определяем элемент book. Элемент book может содержать один элемент title, один или более элементов author (плюсик), один элемент price и один или ни одного элемента description (знак вопроса).
  • <!ELEMENT title (#PCDATA)> — определяем элемент title. В качестве содержимого элемента указываем #PCDATA. Это означает, что анализатор обязан разбирать то, что находится внутри этого элемента.
  • Аналогичным образом определяем элементы author, price, description.
  • <!ENTITY myname «Дмитрий Денисов»> — определяем сущность. Сначала пишем саму сущность, а затем в кавычках то, что будет выводиться на ее месте. По умолчанию в XML определено только 3 сущности. Это больше («>» — &lt;), меньше («<» — &gt;) и амперсанд («&» — &amp;). При желании вы можете создать неограниченное количество сущностей, используя данный способ. В качестве значений могут быть не только слова, но и целые предложения значительного объема.
Подключение DTD для валидации XML-документов

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

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

<!DOCTYPE DOCUMENT [ содержимое ]>

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

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

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE pricelist [
<!ELEMENT pricelist (book+)>
<!ELEMENT book (title, author+, price, description?)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT description (#PCDATA)>
]>
<pricelist>
<book>
<title>Книга 1</title>
<author>Автор 1</author>
<price>Цена 1</price>
<description>Описание</description>
</book>
</pricelist>

Внешнее определение DTD — подключение DTD-документа

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

<!DOCTYPE DOCUMENT SYSTEM "file.dtd">

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

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

XML-документ

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE pricelist SYSTEM "file.dtd">
<pricelist>
<book>
<title>Книга 1</title>
<author>Автор 1</author>
<price>Цена 1</price>
<description>Описание</description>
</book>
</pricelist>

DTD файл

<!ELEMENT pricelist (book+)>
<!ELEMENT book (title, author+, price, description?)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT description (#PCDATA)>

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

На этом все. Удачи вам и успехов в изучении XML!