DTD — это… Что такое DTD?
DTD (англ. Document Type Definition определение типа документа) — включает в себя два понятия:
- Термин, который используется для описания схемы документа или его части языком схем DTD.
- Язык схем DTD (DTD schema language) — искусственный язык, который используется для записи фактических синтаксических правил метаязыков разметки текста SGML и XML. С момента его внедрения другие языки схем для спецификаций, такие как XML Schema и RELAX NG, выпускаются с дополнительной функциональностью.
Из-за определённых отличий между XML и SGML, применение DTD также имеет некоторые особенности в зависимости от целевого документа
Сейчас идёт отказ от использования DTD в XML-технологии по ряду причин:
- Используется отличный от XML синтаксис.
- Отсутствует типизация узлов.
- Отсутствует поддержка пространств имён.
На смену DTD пришёл стандарт консорциума W3C XML Schema.
Описание схемы документа
Объявление объектов-параметров
Объявление объекта-параметра определяет макрос определённого типа, на который можно ссылаться и который может быть развернут где-нибудь в 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 — задаёт список возможных альтернатив значений.
Существуют такие свойства по умолчанию:
- IMPLIED — значение атрибута указывать не обязательно;
- REQUIRED — значение атрибута обязательно должно быть указано;
- FIXED — значение этого атрибута задано как константа в DTD и в документе не может быть изменено;
- некоторое конкретное значение, которое используется по умолчанию.
Связь документа с определённым 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) >
Начиная с первой строки:
- Элемент
<people_list>
содержит любое число элементов<person>
. Знак<*>
означает что возможно 0, 1 или более элементов<person>
внутри элемента<people_list>
. - Элемент
<person>
содержит элементы<name>
,<birthdate>
,<gender>
и<socialsecuritynumber>
. Знак<?>
означает что элемент необязателен. Элемент<name>
не содержит<?>
, что означает что элемент<person>
обязательно должен содержать элемент<name>
. - Элемент
<name>
содержит данные. - Элемент
<birthdate>
содержит данные. - Элемент
<gender>
содержит данные. - Элемент
<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-технологии по ряду причин:
- Используется отличный от XML синтаксис.
- Отсутствует типизация узлов.
- Отсутствует поддержка пространств имён.
На смену 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
— задаёт список возможных альтернатив значений.
Существуют такие свойства по умолчанию:
IMPLIED
— значение атрибута указывать не обязательно;REQUIRED
— значение атрибута обязательно должно быть указано;FIXED
— значение этого атрибута задано как константа в DTD и в документе не может быть изменено;- некоторое конкретное значение, которое используется по умолчанию.
Связь документа с определённым 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) >
Начиная с первой строки:
- Элемент
<people_list>
содержит любое число элементов<person>
. Знак<*>
означает что возможно 0, 1 или более элементов<person>
внутри элемента<people_list>
. - Элемент
<person>
содержит элементы<name>
,<birthdate>
,<gender>
и<socialsecuritynumber>
. Знак<?>
означает что элемент необязателен. Элемент<name>
не содержит<?>
, что означает что элемент<person>
обязательно должен содержать элемент<name>
. - Элемент
<name>
содержит данные. - Элемент
<birthdate>
содержит данные. - Элемент
<gender>
содержит данные. - Элемент
<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 "&#60;"> <!ENTITY gt ">"> <!ENTITY amp "&#38;"> <!ENTITY apos "'"> <!ENTITY quot """>
ОБЪЯВЛЕНИЕ ОБОЗНАЧЕНИЯ (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 сущности. Это больше («>» — <), меньше («<» — >) и амперсанд («&» — &). При желании вы можете создать неограниченное количество сущностей, используя данный способ. В качестве значений могут быть не только слова, но и целые предложения значительного объема.
Подключение 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!
Обнаружили ошибку? Выделите ее и нажмите Ctrl+Enter
archive.dmitriydenisov.com
DTD — Википедия
DTD (англ. Document Type Definition — определение типа документа) — включает в себя два понятия:
- Термин, который используется для описания схемы документа или его части языком схем DTD.
- Язык схем DTD (DTD schema language) — компьютерный язык, который используется для записи фактических синтаксических правил метаязыков разметки текста SGML и XML. С момента его внедрения другие языки схем для спецификаций, такие как XML Schema и RELAX NG, выпускаются с дополнительной функциональностью.
Из-за определённых различий между XML и SGML применение DTD также имеет некоторые особенности в зависимости от целевого документа.
Сейчас идёт отказ от использования DTD в XML-технологии по ряду причин:
- Используется отличный от XML синтаксис.
- Отсутствует типизация узлов.
- Отсутствует поддержка пространств имён.
На смену 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
— задаёт список возможных альтернатив значений.
Существуют такие свойства по умолчанию:
IMPLIED
— значение атрибута указывать не обязательно;REQUIRED
— значение атрибута обязательно должно быть указано;FIXED
— значение этого атрибута задано как константа в DTD и в документе не может быть изменено;- некоторое конкретное значение, которое используется по умолчанию.
Видео по теме
Связь документа с определённым 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) >
Начиная с первой строки:
- Элемент
<people_list>
содержит любое число элементов<person>
. Знак<*>
означает что возможно 0, 1 или более элементов<person>
внутри элемента<people_list>
. - Элемент
<person>
содержит элементы<name>
,<birthdate>
,<gender>
и<socialsecuritynumber>
. Знак<?>
означает что элемент необязателен. Элемент<name>
не содержит<?>
, что означает что элемент<person>
обязательно должен содержать элемент<name>
. - Элемент
<name>
содержит данные. - Элемент
<birthdate>
содержит данные. - Элемент
<gender>
содержит данные. - Элемент
<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>
См. также
wiki2.red
DTD — Википедия
DTD (англ. Document Type Definition — определение типа документа) — включает в себя два понятия:
- Термин, который используется для описания схемы документа или его части языком схем DTD.
- Язык схем DTD (DTD schema language) — компьютерный язык, который используется для записи фактических синтаксических правил метаязыков разметки текста SGML и XML. С момента его внедрения другие языки схем для спецификаций, такие как XML Schema и RELAX NG, выпускаются с дополнительной функциональностью.
Из-за определённых различий между XML и SGML применение DTD также имеет некоторые особенности в зависимости от целевого документа.
Сейчас идёт отказ от использования DTD в XML-технологии по ряду причин:
- Используется отличный от XML синтаксис.
- Отсутствует типизация узлов.
- Отсутствует поддержка пространств имён.
На смену 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
— задаёт список возможных альтернатив значений.
Существуют такие свойства по умолчанию:
IMPLIED
— значение атрибута указывать не обязательно;REQUIRED
— значение атрибута обязательно должно быть указано;FIXED
— значение этого атрибута задано как константа в DTD и в документе не может быть изменено;- некоторое конкретное значение, которое используется по умолчанию.
Связь документа с определённым 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) >
Начиная с первой строки:
- Элемент
<people_list>
содержит любое число элементов<person>
. Знак<*>
означает что возможно 0, 1 или более элементов<person>
внутри элемента<people_list>
. - Элемент
<person>
содержит элементы<name>
,<birthdate>
,<gender>
и<socialsecuritynumber>
. Знак<?>
означает что элемент необязателен. Элемент<name>
не содержит<?>
, что означает что элемент<person>
обязательно должен содержать элемент<name>
. - Элемент
<name>
содержит данные. - Элемент
<birthdate>
содержит данные. - Элемент
<gender>
содержит данные. - Элемент
<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>
См. также
wikipedia.green
Введение в XML DTD
Определение типов документа (DTD) декларирует допустимые строительные блоки XML документа. Оно задает структуру документа со списком допустимых элементов и атрибутов.
DTD может декларироваться как в коде самого XML документа, так и во внешнем файле с подключением его к XML документу.
Внутренняя декларация DTD
Если DTD декларируется внутри XML файла, то она должны быть заключена в специальный тег декларации DOCTYPE, который имеет следующий синтаксис:
<!DOCTYPE корневой-элемент [декларации-элементов]>
Пример XML документа с внутренним DTD:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Напоминание</heading>
<body>Не забудь обо мне в эти выходные</body>
</note>
DTD в приведенном примере интерпретируется следующим образом:
- !DOCTYPE note определяет, что корневым элементом документа является note
- !ELEMENT note определяет, что элемент note содержит четыре элемента: to, from, heading, body
- !ELEMENT to определяет, что элемент to должен быть типа «#PCDATA»
- !ELEMENT from определяет, что элемент from должен быть типа «#PCDATA»
- !ELEMENT heading определяет, что элемент heading должен быть типа «#PCDATA»
- !ELEMENT body определяет, что элемент body должен быть типа «#PCDATA»
Внешняя декларация DTD
Если DTD декларируется во внешнем файле, то подключение осуществляется следующим образом:
<!DOCTYPE корневой-элемент SYSTEM "имя файла">
Ниже приводится тот же XML документ, что и ранее, но с внешней декларацией DTD:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Напоминание</heading>
<body>Не забудь обо мне в выходные</body>
</note>
А вот что содержится в файле «note.dtd», который декларирует DTD:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
Для чего используют DTD?
С DTD каждый ваш XML файл может нести описание своего собственного формата.
С DTD различные, не связанные друг с другом, группы людей могут приходить к соглашению о стандартах взаимно обмениваемых данных.
С DTD вы можете быть уверены, что получаемые из внешних источников данные будут корректными.
Также, вы можете использовать DTD, чтобы проводит проверки корректности своих собственных данных.
msiter.ru