Смотреть что такое "DTD" в других словарях. Объявление типа элемента


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

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

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

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

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

"#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;" >

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

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

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

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

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

(DT|DD) +>

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

(%block;|SCRIPT) + -(FORM) >

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

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

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

Например:

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 содержится в самом тексте документа. Например:

]> ]>

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

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

"http://www.w3.org/TR/html4/strict.dtd">

Пример

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

(person*) > (name, birthdate?, gender?, socialsecuritynumber?) > (#PCDATA) > (#PCDATA) > (#PCDATA) >

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

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

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

> > > Fred Bloggs> > 27/11/2008> > Male> > 1234567890> > >

См. также


Wikimedia Foundation . 2010 .

Смотреть что такое "DTD" в других словарях:

    DTD - , die in einer ASCII Datei (ASCII) abgelegte Beschreibung der Struktur von Dokumenten, welche alle vom selben Typ sind. Eine DTD wird nach den Regeln der international anerkannten… … Universal-Lexikon

    DTD - may stand for: Contents 1 Media 2 Music 3 Sports 4 Technologies 4.1 Computing … Wikipedia

    DTD - steht für: Inhaltsverzeichnis 1 Medien 2 Music 3 Technologien 3.1 Computer 3.1.1 Spiele … Deutsch Wikipedia

    Dtd - steht für: Darwin Digital Television, eine australische Fernsehstation Delta Tau Delta, eine US amerikanische Studentenorganisation Document Type Definition, siehe Dokumenttypdefinition … Deutsch Wikipedia

    DTD - (dē tē dēʹ) n. A set of rules for marking up a document in SGML. * * * … Universalium

    DTD - (document type definition) specification written in the Standard Generalized Markup Language and containing information about the format of a particular document (Computers) … English contemporary dictionary

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

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

Синтаксис

Основной синтаксис объявления атрибутов DTD следующим образом:

В вышеуказанном синтаксисе

    Старт атрибутов DTD с Ключевое слово ATTLIST если элемент содержит атрибут.

    элемент-имя определяет имя элемента к которому атрибут применяется.

    атрибут-имя определяет имя атрибута который включен с элемент-именем.

    атрибут-тип определяет тип атрибутов. Мы обсудим больше на этом в следующих разделах.

    атрибут со значением принимает фикчированное значение которое атрибуты должны определить. Мы обсудим больше на этом в следующих разделах.

Пример

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

]>

Tanmay Patil

Препятствуйте нам пойти через вышеуказанный Код:

    Начните с объявлением XML с следующим заявлением:

    Немедленно после коллектора XML тип объявление документа, обыкновенно называемое DOCTYPE:

    DOCTYPE сообщает парсер что DTD связан с этим документом XML. Объявление DOCTYPE имеет восклицательный знак (!) в начале имени элемента.

    Следование тело DTD. Здесь мы объявляли элемент и атрибут:

Удостоверение личности атрибута для имени элемента определено как:

Здесь тип атрибута CDATA и свое значение #REQUIRED .

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

    Все атрибуты используемые в документе XML необходимо объявить в определении типа документа (DTD) используя объявление Атрибут-Списка

    Атрибуты могут только появиться в старт или пустые бирки.

    Ключевое слово ATTLIST должно находиться в верхушке - случае

    Никакие двойные имена атрибута не будут позволены внутри список атрибута для, котор дали элемента.

Типы атрибута

Объявляя атрибуты, вы можете определить как обработчик должен отрегулировать данные которые появляются в значение. Мы можем классифицировать атрибут печатаем внутри 3 главным образом категории на машинке:

    Тип строки

    Типы Tokenized

    Перечисленные типы

Следовать таблица обеспечивает сводку различных типов атрибута:

Тип Описание
CDATA CDATA данные по характера (текст и не повышение цены). Тип атрибута строки .
Удостоверение личности Это уникально обозначение атрибута. Оно не должен появиться больше чем раз. Тип атрибута Tokenized .
IDREF Оно использован для того чтобы снабдить ссылками удостоверение личности другого элемента. Оно использован для того чтобы установить элементы связь между. Тип атрибута Tokenized .
IDREFS Оно использован для того чтобы снабдить ссылками множественное удостоверение личности. Тип атрибута Tokenized .
РЕАЛЬНОСТЬ Она представляет внешнюю реальность в документе. Тип атрибута Tokenized .
РЕАЛЬНОСТИ Оно представляет список внешних реальностей в документе. Тип атрибута Tokenized .
NMTOKEN Оно подобен к CDATA и атрибут со значением состоит из действительного имени XML. Тип атрибута Tokenized .
NMTOKENS Оно подобен к CDATA и атрибут со значением состоит список действительного имени XML. Тип атрибута Tokenized .
НОТАЦИЯ Элемент будет снабжен ссылками к объявленной нотации в документе DTD. Перечисленный тип атрибута .
Обозначение Оно позволяет определить специфический список значений где одно из значений должно соответствовать. Перечисленный тип атрибута .

Объявление атрибута со значением

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

    смогите иметь автоматически принимаемое значение

    смогите иметь фикчированное значение

  • подразумевает

Автоматически принимаемые значения

Он содержит автоматически принимаемое значение. Значения могут быть заключили в одиночные кавычки (") или двойные цитаты (")

Синтаксис

Следование синтаксис значения:

где значени по умолчанию-значение определенный атрибут со значением.

Пример

Следование простой пример объявления атрибута с автоматически принимаемым значением:

]>

Tanmay Patil

В этом примере мы имеем элемент имени с удостоверением личности атрибута которого автоматически принимаемое значение 0 . Автоматически принимаемое значение заключено в пределах двойных цитат.

ФИКЧИРОВАННЫЕ значения

ключевое слово #FIXED следовать фикчированным значением использовано когда вы хотите определить что атрибут со значением постоянн и не может быть изменен. Общяя польза фикчированных атрибутов определяет номера версии.

Синтаксис

Следование синтаксис фикчированных значений:

где #FIXED определенный атрибут со значением.

Пример

Следование простой пример объявления атрибута с ФИКЧИРОВАННЫМ значением:

]>

В этом примере мы использовали #FIXED ключевого слова где оно показывает что значение «tutorialspoint» единственное значение для имени атрибута элемента. Если мы пробуем изменить атрибут со значением после этого, то он дает ошибку.

Следование инвалидный DTD:

]>

we are a free online teaching faculty

НЕОБХОДИМЫЕ значения

Когда вы хотите определите что атрибут необходим, используйте ключевое слово #REQUIRED.

Синтаксис

Следование синтаксис #REQUIRED:

где #REQUIRED определенный тип атрибута.

Пример

Следование простой пример объявления атрибута DTD с ключевым словом #REQUIRED:

]>

Tanmay Patil

В этом примере мы использовали ключевое слово #REQUIRED для того чтобы определить что удостоверение личности атрибута необходимо предусмотреть для имени элемент- имени

ПОДРАЗУМЕВАЕМЫЕ значения

Объявляя атрибуты вы должны всегда определять объявление значения. Если атрибут вы объявляете не имеет никакое автоматически принимаемое значение, то не имеет никакое фикчированное значение, и не требует, тогда вы должны объявить что атрибут как подразумевали . #IMPLIED ключевого слова использовано для того чтобы определить атрибут как подразумевали .

Синтаксис

Следование синтаксис #IMPLIED:

где #IMPLIED определенный тип атрибута.

Пример

Следование простой пример #IMPLIED

]>

В этом примере мы использовали #IMPLIED ключевого слова по мере того как мы не хотим определить любые атрибуты, котор нужно включить в имени элемента. Оно опционный.

В XML - документах DTD определяет набор действительных элементов, идентифицирует элементы, которые могут находиться в других элементах, и определяет действительные атрибуты для каждого из них. Синтаксис DTD весьма своеобразен и от автора-разработчика требуются дополнительные усилия при создании таких документов(сложность DTD является одной из причин того, что использование SGML , требующего определение DTD для любого документа, не получило столь широкого распространения как, например, HTML ). Как уже отмечалось, в XML использовать DTD не обязательно - документы, созданные без этих правил, будут правильно обрабатываться программой-анализатором, если они удовлетворяют основным требованиям синтаксиса XML . Однако контроль за типами элементов и корректностью отношений между ними в этом случае будет полностью возлагаться на автора документа. До тех пор, пока грамматика нашего нового языка не описана, его сможем использовать только мы, и для этого мы будем вынуждены применять специально разработанное программное обеспечение, а не универсальные программы-анализаторы..

В DTD для XML используются следующие типы правил: правила для элементов и их атрибутов, описания категорий(макроопределений), описание форматов бинарных данных. Все они описывают основные конструкции языка - элементы, атрибуты, символьные константы внешние файлы бинарных данных.

Для того, чтобы использовать DTD в нашем документе, мы можем или описать его во внешнем файле и при описании DTD просто указать ссылку на этот файл или же непосредственно внутри самого документа выделить область, в которой определить нужные правила. В первом случае в документе указывается имя файла, содержащего DTD - описания:

...

Внутри же документа DTD- декларации включаются следующим образом:

... ... ]> ...

В том случае, если используются одновременно внутренние и внешние описания, то программой-анализатором будут сначала рассматриваться внутренние, т.е. их приоритет выше. При проверке документа XML - процессор в первую очередь ищет DTD внутри документа. Если правила внутри документа не определены и не задан атрибут standalone ="yes" , то программа загрузит указанный внешний файл и правила, находящиеся в нем, будут считаны оттуда. Если же атрибут standalone имеет значение "yes" , то использование внешних DTD описаний будет запрещено.

Определение элемента

Элемент в DTD определяется с помощью дескриптора!ELEMENT , в котором указывается название элемента и структура его содержимого.

Например, для элемента можно определить следующее правило:

Ключевое слово ELEMENT указывает, что данной инструкцией будет описываться элемент XML . Внутри этой инструкции задается название элемента (flower) и тип его содержимого.

В определении элемента мы указываем сначала название элемента(flower) , а затем его модель содержимого - определяем, какие другие элементы или типы данных могут встречаться внутри него. В данном случае содержимое элемента flower будет определяться при помощи специального маркера PCDATA (что означает parseable character data - любая информация, с которой может работать программа-анализатор). Существует еще две инструкции, определяющие тип содержимого: EMPTY ,ANY . Первая указывает на то, что элемент должен быть пустым(например, ), вторая - на то, что содержимое элемента специально не описывается.

Последовательность дочерних для текущего элемента объектов задается в виде списка разделенных запятыми названий элементов. При этом для того, чтобы указать количество повторений включений этих элементов могут использоваться символы +,*, ? :

В этом примере указывается, что внутри элемента должны быть определены элементы title , author и table-of-contents , причем элемент title является обязательным элементом и может встречаться лишь однажды, элемент author может встречаться несколько раз, а элемент table-of-contents является опциональным, т.е. может отсутствовать. В том случае, если существует несколько возможных вариантов содержимого определяемого элемента, их следует разделять при помощи символа "|" :

Символ * в этом примере указывает на то, что определяемая последовательность внутренних элементов может быть повторена несколько раз или же совсем не использоваться.

Если в определении элемента указывается "смешанное" содержимое, т.е. текстовые данные или набор элементов, то необходимо сначала указать PCDATA , а затем разделенный символом "|" список элементов.

Пример корректного XML - документа:

]> ...
Marks avenue
12-12-12 46-23-62 [email protected]

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

Списки атрибутов элемента определяются с помощью ключевого слова!ATTLIST . Внутри него задаются названия атрибутов, типы их значений и дополнительные параметры. Например, для элемента

могут быть определены следующие атрибуты:

В данном примере для элемента article определяются три атрибута: id, about и type ,которые имеют типы ID (идентификатор), CDATA и список возможных значений соответственно. Всего существует шесть возможных типов значений атрибута:

  • CDATA - содержимым документа могут быть любые символьные данные
  • ID - определяет уникальный идентификатор элемента в документе
  • IDREF (IDREFS )- указывает, что значением атрибута должно выступать название(или несколько таких названий, разделенных пробелами во втором случае) уникального идентификатора определенного в этом документе элемента
  • ENTITY (ENTITIES ) - значение атрибута должно быть названием(или списком названий, если используется ENTITIES ) компонента (макроопределения), определенного в документе
  • NMTOKEN (NMTOKENS ) - содержимым элемента может быть только одно отдельное слово(т.е. этот параметр является ограниченным вариантом CDATA )
  • Список допустимых значений - определяется список значений, которые может иметь данный атрибут.

Также в определении атрибута можно использовать следующие параметры:

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

Определение компонентов(макроопределений)

Компонент (entity) представляет собой определения, содержимое которых может быть повторно использовано в документе. В других языках программирования подобные элементы называются макроопределениями. Создаются DTD - компоненты при помощи инструкции !ENTITY :

Программа-анализатор, просматривая в первую очередь содержимое области DTD - определений, обработает эту инструкцию и при дальнейшем разборе документа будет использовать содержимое DTD - компонента в том месте, где будет встречаться его название. Т.е. теперь в документе мы можем использовать выражение &hello ; , которое будет заменено на строчку " Мы рады приветствовать Вас"

В общем случае, внутри DTD можно задать три типа макроопределений:

Внутренние макроопределения - предназначены для определения строковой константы, с их помощью можно организовывать ссылки на часто изменяемую информацию, делая документ более читабельным. Внутренние компоненты включаются в документ при помощи амперсанта &

В XML существует пять предустановленных внутренних символьных констант:

  • < - символ "<"
  • > - символ ">"
  • & - символ "&"
  • " - символ апострофа """
  • " - символ двойной кавычки """

Внешние макроопределения - указывают на содержимое внешнего файла, причем этим содержимым могут быть как текстовые, так и двоичные данные. В первом случае в месте использования макроса будут вставлены текстовые строки, во втором - бинарные данные, которые анализатором не рассматриваются и используются внешними программами

Макроопределения правил - макроопределения параметров могут использоваться только внутри области DTD и обозначаются специальным символом % , вставляемым перед названием макроса. При этом содержимое компонента будет помещено непосредственно в текст DTD - правила

Например, для следующего фрагмента документа:

можно использовать более короткую форму записи:

Макроопределения часто используются для описания параметров в правилах атрибутов. В этом случае появляется возможность использовать одинаковые определения атрибутов для различных элементов:

Типизация данных

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

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

Задав атрибуту значение по умолчанию LONG и определив его как FIXED , мы позволили тем самым программе-клиенту получить необходимую информацию о типе содержимого данного элемента, и теперь она может самостоятельно определить соответствие типа этого содержимого указанному в DTD - определении.

Вот пример XML - документа, в котором определяются и используются несколько элементов с различными типами данных:

... 5 2 32.5 true 18346 34 р. 28 к. ...

Как видно из примера, механизм создания элементов документа при этом нисколько не изменился. Все необходимая для проверки типов данных информация заложена в определения элементов внутри блока DTD .

В заключении хотелось бы отметить, что DTD предоставляет нам весьма удобный механизм осуществления контроля за содержимым документа. На сегодняшний день, практически все программы просмотра документов Интернет используют DTD -правила. Однако это далеко не единственный способ проверки корректности документа. В настоящий момент в W3 консорциуме находится на рассмотрении новый стандарт языка описания структуры документов, называемый схемами данных. Следующий раздел посвящен работе с ними.

Это очередная статья в цикле «Основы XML» и в ней мы рассмотрим основы описания структуры XML данных при помощи DTD. Это довольно таки старый способ описания структуры XML-документов, но он до сих пор используется, поэтому мы его все же рассмотрим.

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

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

Итак, начнем.

Что такое DTD в XML и для чего он нужен

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

Необходимость проверки грамматики XML-документов заключается в следующем:

  • XML-документ может быть предназначен не для вашей системы.
  • XML-документ может содержать неправильные данные.
  • XML-документ может содержать ошибки в структуре ().

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

Недостатки XML DTD

  • Отличный от XML синтаксис языка. Это вызывает множество проблем, таких как, например, проблемы с кодировкой или невозможность отслеживать ошибки.
  • Нет проверки типов данных. В DTD есть только один тип – строка.
  • В DTD нет . Нельзя поставить в соответствие документу два и более DTD описаний.

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

Объявление элементов, атрибутов и сущностей в DTD. Модификаторы «*», «?», «+»

Для объявления элементов, атрибутов и сущностей в DTD используются специальные декларации и модификаторы. Чтобы подробно во всем разобраться, давайте для начала рассмотрим теоритическую информацию, а затем во второй части статьи перейдем к практическим примерам.

Определение элемента XML и последовательности элементов XML

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Книга 1 &myname; Цена 1 Описание

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

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

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

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

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

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

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

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

]>

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

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

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

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

XML-документ

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

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

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

XML-схема обладает более мощными возможностями, чем DTD. Для иллюстрации преимуществ использования механизма XML-схем в первых трех листингах сравниваются различные способы представления элементов. В представлена выдержка из XML-документа. В показаны два элемента, объявленные в синтаксисе DTD, а в представлен синтаксис, соответствующий XML-схеме. Обратите внимание, что синтаксис в Листинге 3 подобен синтаксису XML. При использовании схемы, валидирующий парсер может выполнить проверку, является ли элемент InvoiceNo положительным целым числом, и состоит ли ProductID из заданного набора символов (шести цифр и одной буквы от A до Z). Парсер, обрабатывающий DTD-определение, может лишь подтвердить, что данные элементы представляют собой строки.

Листинг 1: Фрагмент XML-документа
123456789 J123456
Листинг 2: Фрагмент DTD, описывающий элементы из Листинга 1
Листинг 3: Фрагмент XML-схемы, описывающий элементы из Листинга 1

Использование пространств имен в XML-схеме

Ограничения DTD

Несмотря на то, что DTD служат разработчикам SGML и HTML в качестве механизма описания структурированной информации вот уже на протяжении 20-ти лет, DTD обладают некоторыми ограничениями по сравнению с XML-схемами.

Согласно DTD элемент может быть представлен одним из трех способов:

  • Текстовая строка
  • Текстовая строка, смешанная с другим дочерним элементом
  • Набор дочерних элементов

DTD не обладает синтаксисом XML и предлагает лишь ограниченную поддержку для типов и пространств имен.

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

Такая XML-схема определяет набор новых имен, таких как имена элементов, типов, атрибутов, групп атрибутов, чьи определения и объявления описаны в схеме. В имена определяются как InvoiceNo , ProductID и ProductCode .

Имена, определенные в схеме принадлежат так называемому целевому пространству имен . Само по себе пространство имен является фиксированным, произвольным именем, которое должно соответствовать синтаксису URL. К примеру, пространство имен для схемы, представленной в , можно задать следующим образом: http://www.SampleStore.com/Account .

Синтаксис объявления пространства имен иногда может сбить с толку. Объявление начинается с http:// , однако оно не ссылается на файл с описанием схемы. На самом деле, ссылка http://www.SampleStore.com/Account вообще не ведет ни на один файл, а только на назначенное имя.

Определения и объявления в схеме могут ссылаться на имена, которые могут принадлежать другим пространствам имен. В данной статье мы ссылаемся на такие пространства имен как на исходные пространства имен . В каждой схеме может быть определено одно целевое пространство имен и возможно множество исходных пространств имен. Вообще, каждое имя в заданной схеме принадлежит некоему пространству имен. Имена пространства имен могут быть довольно длинными, однако их можно сократить при помощи синтаксиса объявления xmlns в документе XML-схемы. Все эти концепции проиллюстрированы в .

Листинг 4: Целевое и исходное пространства имен

В XML-схеме, представленной с , пространством имен targetNamespace является http://www.SampleStore.com/Account , оно содержит имена InvoiceNo , ProductID и ProductCode . Имена schema , element , simpleType , pattern , string и positive-integer принадлежат исходному пространству имен http://www.w3.org/1999/XMLSchema , которое сокращается как xsd путем объявления xmlns . В псевдониме xsd нет ничего особенного, можно выбрать и другое имя. Для удобства и простоты в оставшейся части статьи мы будем использовать префикс xsd для ссылки на пространство имен http://www.w3.org/1999/XMLSchema , пропуская уточнение xsd в некоторых частях кода. В нашем примере targetNamespace является также одним из исходных пространств имен, так как имя ProductCode используется в определении других имен.

Рисунок 1: Пространства имен для Листинга 4
Листинг 5: Множество исходных пространств имен, импорт пространства имен

Определение элементов

Определением элемента заключается в определении его имени и модели контента. В XML-схеме модель контента элемента определяется его типом. Следовательно, элементы в XML-документе могут иметь только значения, которые подходят типам, определенным в его схеме.

Простые типы

Спецификация XML-схемы определяет несколько простых типов для значений, как показано в Таблице 2 -предопределенные простые типы значений.

Тип элемента может быть простым или комплексным (сложным). Элемент простого типа не может содержать другие элементы или атрибуты. Комплексный тип может создавать эффект встраивания элементов в другие элементы или может ассоциировать атрибуты с элементом. До этого момента мы использовали только примеры с простыми типами, определенными пользователем (см. ProductCode). В спецификацию XML-схемы также включены предопределенные простые типы (см. вставку ). Предопределенный простой тип ограничивает значения по их базовому типу. К примеру, значением предопределенного простого типа ProductCode является подмножество значений базового типа string .

Простые, не вложенные элементы имеют простой тип

Элемент, который не содержит атрибутов или других элементов может быть отнесен к простому типу, предопределенному или определенному пользователем, такому как string , integer , decimal , time , ProductCode и т.п.

Листинг 7: Некоторые простые типы элементов

Элементы с атрибутами должны иметь комплексный тип

Теперь попробуем добавить к простому элементу price из атрибут currency . Вы не сможете этого сделать, так как элемент простого типа не может иметь атрибутов. Если вы хотите добавить атрибут, вам необходимо определить price как элемент комплексного типа. В примере из , мы определяем, так называемый анонимный тип , в котором комплексному типу не дается явного имени. Другими словами, атрибут name элемента complexType не определен.

Листинг 8: Элемент комплексного типа

Элементы, содержащие вложенные элементы должны иметь комплексный тип

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

Таблица 1: Сравнение комплексных типов данных в DTD и XML-схеме

XML-документ
Cool XML<Title> <Author>Cool Guy</Author> </Book> </span><h5>DTD</h5><span> <!ELEMENT Book (Title, Author)> <!ELEMENT Title (#PCDATA)> <!ELEMENT Author (#PCDATA)> </span><h5>XML-схема</h5><span> <element name="Book" type="BookType"/> <complexType name="BookType"> <element name="Title" type="string"/> <element name="Author" type="string"/> </complexType> </span><h5>Листинг 10: Скрытие BookType как локального типа</h5><span> <element name="Title" type="string"/> <element name="Author" type="string"/> <element name="Book"> <complexType> <element ref="Title"/> <element ref="Author"/> </complexType> </element> </span><h2>Выражение сложных ограничений для элементов</h2><p>XML-схема предлагает большую гибкость, чем DTD при выражении ограничений для модели контента элементов. На простейшем уровне, таком как в DTD, вы можете ассоциировать с элементом атрибуты, а также указать, что в нем может появляться последовательность из только одного (1), нуля или более (*), или одного или более (+) элементов из заданного набора элементов. В XML-схеме можно выразить дополнительные ограничения, используя для этой цели, к примеру, атрибуты minOccurs и maxOccurs для элемента element и элементы choice , group и all .</p><h5>Листинг 11: Выражение ограничений для типов элементов</h5><span> <element name="Title" type="string"/> <element name="Author" type="string"/> <element name="Book"> <complexType> <element ref="Title"/> <element ref="Author"/> </complexType> </element> </span><p>В тег Title является опциональным по отношению к тегу Book (такое же правило можно задать и в DTD). Однако здесь также говорится, что в элементе Book должен быть хотя бы один и не более двух элементов Author . Значением атрибутов minOccurs и maxOccurs тега element по умолчанию является 1. Элемент choice указывает на то, что может появиться только один из указанных дочерних элементов. Другой элемент all определяет, что все дочерние элементы могут появляться только один раз, вместе и в любом порядке, или не появляться совсем. В объявляется, что оба <a href="/v-pamyat-o-keywords-dlya-chego-nuzhen-meta-teg-keywords-pochemu-on-ne-rabotaet/">тега Title</a> и Author должны появляться в Book в любом порядке, или не появляться вообще. Подобные ограничения сложно выразить при помощи DTD.</p><h5>Листинг 12: Указатель того, что у элемента должны быть определены все типы</h5><span> <xsd:element name="Title" type="string"/> <xsd:element name="Author" type="string"/> <xsd:element name="Book"> <xsd:complexType> <xsd:all> <xsd:element ref="Tile"/> <xsd:element ref="Author"/> </xsd:all> </xsd:complexType> </xsd:element> </span><h2>Подведение итогов</h2><p>В <a href="/poisk-dokumentov-i-dannyh-v-internet-sekrety-poiska-v-internet-i/">данном документе</a> мы раскрыли при помощи <a href="/kak-sostavit-semanticheskoe-yadro-stati-prostoi-primer-sostavleniya/">простых примеров</a> наиболее фундаментальные концепции, необходимые для определения структуры элементов при помощи XML-схемы. Доступно также множество других мощных механизмов:</p><ul><li>XML-схема содержит всестороннюю поддержку для наследования типов, позволяя повторно использовать определенные ранее структуры. Такое использование называют <i>аспектами </i>. Вы можете вывести новые типы, представляющие меньшее подмножество значений других типов, к примеру, для определения подмножества по перечислению, диапазону или по совпадению с шаблоном. В одном из примеров данной статьи тип ProductCode был определен с использованием аспекта pattern . В подтипе также можно добавить для базового типа новые элементы и атрибуты.</li><li>Несколько механизмов, позволяющих контролировать <a href="/bluescreenview-kak-polzovatsya-dlya-opredeleniya-prichiny-bsod-obshchie-rekomendacii-po/">общее определение</a> подтипа или заменять его в определенном документе. К примеру, можно указать, что тип InvoiceType (тип номера инвойса) не может содержать подтипы, то есть никто не сможет определить <a href="/skachat-flesh-pleer-novoi-versii-v-novoi-versii/">новую версию</a> InvoiceType . Можно также задать, что в отдельном контексте для типа ProductCode не может быть замещения подтипов.</li><li>Кроме использования подтипов, можно определять эквивалентные типы, то есть значение одного типа может быть замещено значением другого.</li><li>XML-схема обеспечивает механизм для замещения элемента или типа путем объявления их как абстрактных.</li><li>Для большего удобства можно обозначить и задать имена группам атрибутов или элементов. Это позволяет повторно использовать их при последующих обращениях.</li><li>XML-схема предоставляет три элемента – appInfo , documentation и annotation – для использования комментариев, как людьми (documentation) так и приложениями (appInfo)</li><li>Вы можете выразить уникальные ограничения, основывающиеся на определенных атрибутах дочерних элементов.</li> </ul><p>Дополнительную информацию по XML-схемам можно получить из документаций на сайтах W3C (См. ) и dW XML zone. Теперь, когда спецификация XML-схемы получила подтверждение в качестве кандидата на рекомендацию W3C, вы без сомнения можете использовать ее в полной мере.</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div><div class="clear"></div> <script type="text/javascript"> document.getElementById('hc_full_comments').innerHTML = ''; </script><br /><br /><noindex><p align="center"><center> <div id="meta_news_block1111" style="text-align: center;"></div></center> </p> <br /><br /> <p align="center"> </p> </noindex> </div> </div> <div id="sidebar"> <div class="clear"></div><br /> <h2 class="front" style="margin:15px 0 5px 0">Популярные статьи</h2> <div class="tabcont"> <ol> <li><a href="/nout-ne-vidit-zagruzochnuyu-fleshku-s-windows-pochemu-bios-ne-vidit-zagruzochnuyu-fleshku-bios-ne-vidit-z/">Почему BIOS не видит загрузочную флешку</a></li> <li><a href="/kak-v-fotoshope-peremestit-neskolko-sloev-kak-vydelit/">Как выделить, переместить слой в фотошопе</a></li> <li><a href="/chto-wps-routere-tp-link-chto-oznachaet-knopka-wps-na-routere-funkciya-wps-v-routere/">Что означает кнопка wps на роутере?</a></li> <li><a href="/kak-perenesti-prilozheniya-s-telefona-na-kompyuter-proverennye-sposoby-perenesti-foto-s-pk-na-planshet/">Проверенные способы перенести фото с пк на планшет или смартфон андроид</a></li> <li><a href="/f2fs-failovaya-sistema-pereezd-s-hdd-na-ssd-i-f2fs-berezhnoe-otnoshenie-k-nakopitelyu/">Переезд с HDD на SSD и F2FS</a></li> </ol> </div> <h2 class="front" style="margin:15px 0 5px 0">Последние статьи</h2> <div class="tabcont"> <ol> <li><a href="/kak-sdelat-zakrytoi-stranicu-v-instagrame-kak-zakryt/">Как закрыть профиль в инстаграме после обновления с телефона</a></li> <li><a href="/skachat-programmu-vosstanovleniya-vindovs-7-vosstanovlenie/">Восстановление системы Windows</a></li> <li><a href="/kak-izmenit-prilozhenie-po-umolchaniyu-na-android-kak-sd-kartu/">Как SD-карту сделать основной памятью на Андроид Как изменить место сохранения файлов на android</a></li> <li><a href="/chto-znachit-vai-fai-mimo-mimo-antenna---chto-eto-takoe-i-v-chem-ee/">MIMO антенна - что это такое и в чем ее приемущество?</a></li> <li><a href="/pochemu-ne-rabotaet-yutub-na-televizore-prichiny-i-chto-delat-propal-ili/">Пропал или не работает Ютуб на телевизоре Youtube на старых телевизорах</a></li> <li><a href="/displayport-raz-m-dlya-peredachi-video-i-audio-signala-s-vysokoi/">DisplayPort — разъём для передачи видео и аудио сигнала с высокой скоростью</a></li> <li><a href="/dlya-chego-lyudi-ispolzuyut-internet-pochemu-lyudi-ispolzuyut/">Почему люди используют Интернет?</a></li> </ol> </div> <div class="widget" id="ajdg_grpwidgets-3"> <div class="g g-9"> <div class="g-single a-27"> <script> jQuery(function() { window.onscroll = function() { height_scroll = jQuery(document).scrollTop(); height = jQuery(document).height(); height50 = height / 2; if (height_scroll >= height50) { jQuery("#site-code-block-22").fadeIn(1200); document.getElementById('site-code-block-22').style.display = 'block'; jQuery("#site-code-block-23").fadeOut(1200); document.getElementById('site-code-block-23').style.display = 'none'; } else { jQuery("#site-code-block-22").fadeOut(1200); document.getElementById('site-code-block-22').style.display = 'none'; document.getElementById('site-code-block-23').style.display = 'block'; jQuery("#site-code-block-23").fadeIn(1200); } }; }); </script> <div class="site-code-block prma-count" data-rel="cb_23" id="site-code-block-23" style=""> </div> <div class="site-code-block prma-count" data-rel="cb_22" id="site-code-block-22" style=""> </div> </div> </div> </div> <div class="clear"></div> <br /> <center> <div style="color: #333333; font-size: 11px;"> </div> </center> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> <br /><br /> <div id="footeri"> <div id="footer"> <div class="footer-sec"> <h6>Разделы</h6> <ul> <li><a href="/category/youtube/">Youtube</a></li> <li><a href="/category/facebook/">Facebook</a></li> <li><a href="/category/twitter/">Twitter</a></li> <li><a href="/category/tips/">Советы</a></li> <li><a href="/category/useful-tips/">Полезные советы</a></li> <br /> </ul> </div> <div class="footer-sec"> <h6>Страницы</h6> <ul> <li><a href="">О проекте</a></li> <noindex> <li><a href="" >RSS новости</a></li> </noindex> </ul><br /><br /><br /> <h6>Спецпроекты</h6> <ul> <li><a href="/feedback/">Связаться с нами</a></li> </ul> </div> <div id="footer-top"> <h6>Контакты</h6> <ul> <li><a href="">Реклама на сайте</a></li> <li><a href="/feedback/">Контакты</a></li> </div> <div class="clear"></div> </div></div> <div id="bottom"><div class="foot_col1"> 2024 © <a href="/">gtavrl.ru</a>. </div> <script type="text/javascript">var addthis_config = { "data_track_addressbar":true,"pubid": "ra-58b68bb0f1371607"} ;addthis_config.data_track_addressbar = false;addthis_config.data_track_clickback = false;</script> <script type='text/javascript'> var flag_hide = 0; function hide_direct() { flag_hide = 1; jQuery('#rek_mob_fixed').slideToggle( 'slow' ); var date = new Date(); var expires_hour = 21600000; date.setTime(date.getTime()+expires_hour); showSocial(); Cookies.set('advp_show_me', '1', { expires: date, path: '/'} ); } ; jQuery(function(f){ var element = f('#rek_mob_fixed'); element.delay(8000); f(window).scroll(function(){ if (flag_hide == 0){ var offset_element_for_hide = jQuery('#before_footer').val(); if (offset_element_for_hide != null) { offset_element_for_hide = jQuery('#before_footer'); offset_element_for_hide = jQuery(offset_element_for_hide).offset().top - jQuery(window).height(); } else { offset_element_for_hide = jQuery(document).height(); } //Если рекламный блок более 1000px по ширине, устанавливай фикс. ширину 1000px if (jQuery('#rek_mob_fixed_block').actual('width') >1000) { jQuery('#rek_mob_fixed_block').css({ 'max-width':'1000px'} ); } if(f(this).scrollTop() > 500){ element.fadeIn(0); } if(f(this).scrollTop() < 500 || f(this).scrollTop() > offset_element_for_hide ){ element.fadeOut(0) } if(f(this).scrollTop() + f(this).height() >= f(document).height() && flag_hide == 0 && jQuery('#rek_mob_fixed').is(':visible')) { jQuery('#rek_mob_fixed').slideToggle(100); } } } ); } ); function showSocial(){ if(flag_hide == 1 ) jQuery('#footer-share').slideToggle('slow'); } </script><div id="wondergridgallerylightbox_options" data-skinsfoldername="skins/default/" data-jsfolder="/wp-content/plugins/modesco-wonderplugin-gridgallery/engine/" style="display:none;"></div> <script type='text/javascript' src='https://gtavrl.ru/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=4.9.2'></script> <script type='text/javascript' src='https://gtavrl.ru/wp-content/plugins/modesco-monica/script.min.js?ver=4.9.1'></script> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "visibility_show":"\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c","visibility_hide":"\u0441\u043a\u0440\u044b\u0442\u044c","width":"100%"} ; /* ]]> */ </script> <script type='text/javascript' src='https://gtavrl.ru/wp-content/plugins/modesco-table-of-contents-plus/front.js?ver=1404'></script> <script type='text/javascript' src='https://gtavrl.ru/wp-content/plugins/page-links-to/js/new-tab.min.js?ver=2.9.8'></script> <script type='text/javascript'> var q2w3_sidebar_options = new Array(); q2w3_sidebar_options[0] = { "sidebar" : "ads-sidebar", "margin_top" : 10, "margin_bottom" : 50, "stop_id" : "before_footer", "screen_max_width" : 0, "screen_max_height" : 0, "width_inherit" : false, "refresh_interval" : 1500, "window_load_hook" : false, "disable_mo_api" : false, "widgets" : ['ajdg_grpwidgets-3'] } ; </script> <script type='text/javascript' src='https://gtavrl.ru/wp-content/plugins/q2w3-fixed-widget/js/q2w3-fixed-widget.min.js?ver=5.0.4'></script> <script type='text/javascript' src='https://gtavrl.ru/wp-content/plugins/youtube-embed-plus/scripts/fitvids.min.js?ver=4.9.1'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=4.9.1'></script> <script type="text/javascript"> var _hcwp = _hcwp || []; var _hcobj = { widget_id : 29264, widget : "Bloggerstream",selector: '.hc_counter_comments',platform:"wordpress", } ; _hcwp.push(_hcobj); (function() { if("HC_LOAD_INIT" in window)return; HC_LOAD_INIT = true; var lang = "ru"; var hcc = document.createElement("script"); hcc.type = "text/javascript"; hcc.async = true; hcc.src = ("https:" == document.location.protocol ? "https" : "http")+"://w.hypercomments.com/widget/hc/29264/"+lang+"/widget.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hcc, s.nextSibling); } )(); </script> </body> </div> </body> </html> <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>