DOCUMENT TYPE DEFINITION

 

                              Г.Е. Берман (berman@tversu.ru)

 

1. Внутренние и внешние DTD

2. Элементы

2.1. Типы элементов

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

3. Атрибуты

3.1. Общие понятия

3.2. Типы атрибутов

3.3. Типы значений атрибутов

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

3.5. Пример описания атрибутов

4. Объекты

4.1. Общие понятия

4.2. Текстовый объект

4.3. Двоичный объект

4.4. Параметрический объект

4.5. Символьные и числовые объекты

 

 

Данный документ  представляет собой лекцию по курсу «XML технологии»   и описывает  назначение, правила использования и синтаксис DTD (Document Type Definition – Описание Типа Документов).

 

Все XML документы можно разделить на две группы:

·       Правильные (well-formed);

·       Состоятельные (valid).

 

Правильные документы должны удовлетворять требованиям синтаксиса XML документов:

·       теги должны быть парными;

·       обязательно должен быть корневой тег;

·       вложенность элементов должна быть корректной.

Более подробно требования, предъявляемые к правильным документам, рассмотрены в предыдущей лекции «Общее описание XML документов».

 

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

 

1.    Внутренние и внешние DTD

 

DTD, относительно XML документа, могут быть внутренними и внешними.

Внутренние DTD располагаются в том же файле, что и сам XML документ.

Внутренние DTD описываются предложением DOCTYPE, которое имеет следующий вид:

<!DOCTYPE library [

         

]>

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

Пример XML документа с внутренним DTD приведен ниже:

<?xml library version=”1.0” encoding=”Windows-1251”?>

<!DOCTYPE library [

         

>]

   <library>

       <book>

          <title> … </title>

          <author> … </author>

       </book>

   </library>

 

Внешние DTD располагаются физически в отдельном файле, который должен иметь расширение dtd. Местоположение dtd файла указывается в предложении DOCTYPE, которое имеет следующий формат:

 

<!DOCTYPE имя_XML [SYSTEM/PUBLIC] “URL”>

 

Например,

<?xml library version=”1.0” encoding=”Windows-1251”?>

<!DOCTYPE library SYSTEM “c:\xml\library.dtd”>

   <library>

       <book>

          <title> … </title>

          <author> … </author>

       </book>

   </library>

В данном примере внешний DTD находится на диске с: в каталоге xml. URL может указывать и на любой файл в Интернет:

<!DOCTYPE library SYSTEM “www.library.org/dtd/library.dtd”>

 

В предложении DOCTYPE, которое описывает внешний DTD должно присутствовать ключевое слово SYSTEM или PUBLIC. Использование ключевого слова SYSTEM говорит анализатору, что он должен взять DTD по указанному адресу. Обычно в предложении DOCTYPE указывается именно SYSTEM.

 

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

<!DOCTYPE library PUBLIC “library.dtd”>

 

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

<!DOCTYPE library PUBLIC “library.dtd”

                                  SYSTEM www.library.org/dtd/library.dtd>

 

2. Элементы

2.1. Типы элементов

 

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

 

Теги XML документа могут быть двух типов:

·       контейнерные, представляются парой тегов (начальный и конечный);

·       пустые, представляются одиночным тегом. Признаком пустого тега является слеш перед закрывающейся угловой скобкой.

Контейнерный тег хранит в себе текст или другие теги. В примере, описывающем библиотечный каталог, все теги контейнерные. Так тег <book> является контейнерным, поскольку хранит в себе другие теги <title> и <author>. Соответственно теги <title> и <author> являются контейнерными, поскольку хранят в себе текст: название книги и имя автора.

 

Пустые теги не могут содержать в себе текст или другие теги. Обычно они используются для включения объектов. Что такое объекты, и какие виды объектов существуют, описывается в разделе «Объекты» данного документа. Здесь, в качестве примера, покажем, как можно включить в текст XML документа такой объект, как графический файл:

<image file="c:\image\image.gif" />

 

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

 

Элементы в DTD объявляются с помощью предложения, которое имеет следующий формат:

 

<!ELEMENT имя_тега>

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

<!ELEMENT library>

<!ELEMENT book>

<!ELEMENT title>

<!ELEMENT name>

 

Примечание. Данный фрагмент объявления включает описание элементов без учета правил вложенности. Описание этих правил представлено в документе «Описание контейнерной структуры XML документов», который находится по адресу homepages.tversu.ru/~berman/dtd/cont/conteiner.htm

 

                    3. Атрибуты

 

3.1. Общие понятия

 

Элементы описывают основные понятия предметной области. Атрибут уточняет информацию об этом понятии. Он позволяет понять, какая информация связана с элементами и, самое главное, контролировать тип этой информации.

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

<img src="http://www.mysite.com/image.gif" align= "left"                                 alt= "Пример изображения" border= "1" width= "150" height= "100" />

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

 

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

 

<img>

          <src> http://www.mysite.com/image.gif</src>

          <align>left</align>

          <alt> Пример изображения</alt>

          <border>1</border>

          <width>150</width>

          <height>100</height>

</img>

 

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

 

3.2. Типы атрибутов

 

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

·       обязательные;

·       фиксированные;

·       неявные.

 

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

Фиксированные атрибуты – это такие атрибуты значения которых разработчик XML документа не может изменять. Для таких атрибутов можно использовать либо конкретно указанное значение, либо одно из возможных значений. Фиксированные атрибуты могут иметь значение по умолчанию. В этом случае их в тегах XML документа указывать не обязательно, автоматически будут приняты значения по умолчанию.

Неявные атрибуты – это не обязательные и не фиксированные, т.е. все атрибуты, которые не подходят под определение обязательных и фиксированных атрибутов. Неявные атрибуты не имеют значения по умолчанию и не обязаны всегда появляться вместе с элементом к которому они относятся.

Определение типов атрибутов. В DTD типы атрибутов задаются специальными идентификаторами, значение которых представлены в таблице 1.

 

Табл. 1

Тип атрибута

Идентификатор

Обязательный

#REQUIRED

Фиксированный

#FIXED

Неявный

#IMPLIED

         

3.3. Типы значений атрибутов

 

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

·       простой текст;

·       уникальный идентификатор;

·       предопределенное значение;

·       объект.

 

Простой текст – это строки текста, задаваемые разработчиком. Значения неявных атрибутов, как правило, именно простой текст.

Например, мы хотим для книг библиотечного каталога ввести атрибут – адрес сайта издательства в Интернет.

<book site= www.booksite.com>

Тип значения атрибута – простой текст.

 

Уникальный идентификатор – это текстовая строка, уникально идентифицирующая определенный элемент, которая имеет следующий формат:

ID= "уникальный_идентификатор"

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

 

Предопределенное значение – это множество заранее определенных значений только одно, из которых может выбрать разработчик XML документа для присвоения атрибуту. Одно из значений множества может использоваться как значение по умолчанию.

Например, в HTML атрибут ALIGN, отвечающий за расположение текста на строке может принимать только одно из трех предопределенных ему значений {LEFT, CENTER, RIGHT}.

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

 

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

 

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

 

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

<!ATTLIST имя_элемента имя_атрибута

                     тип_значения тип_атрибута "значение_по_умолчанию"

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

В предложении ATTLIST тип значения атрибута представлен идентификаторами, значения которых даны в таблице 2.

Табл.2.

Тип

Иденификатор

Простой текст

CDATA

Уникальный идентификатор

ID

Предопределенное значение

(значение | значение |…|значение

Нетекстовый объект

ENTITY

 

3.5. Пример описания атрибутов

 

Допустим, в используемом нами XML документе, есть элемент image, атрибуты которого определяют графический файл и правила его расположения на экране:

<image id="PIC1" border="0" alt="просто рисунок"

             src="www.mysite.com/image/image.gif" align="center" />

 Описание элемента image для нашего примера будет вид:

 

<!ELEMENT image empty>

1

<!ATTLIST image id ID #REQUIRED

2

 

border CDATA #IMPLIED

3

 

alt CDATA #IMPLIED

4

 

src ENTITY #REQUIRED

5

 

align (left,center,right) #REQUIRED "left"

6

 

valign CDATA #FIXED "middle"

7

 

Примечание. Цифры 1-7 в правой части примера служат только для идентификации строк и не являются частью примера.

Строка 1 описывает элемент image. Параметр empty показывает, что элемент image пустой.

Строка 2 задает список атрибутов и описывает уникальный идентификатор ID, который в данном примере является обязательным.

Строка 3 описывает атрибут border как неявный, простой текст.

Строка 4 описывает атрибут alt как обязательный, простой текст.

Строка 5 описывает атрибут src как обязательный, нетекстовый объект.

Строка 6 описывает атрибут align как обязательный, предопределенное значение, значение по умолчанию lefr.

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

 

                    4. Объекты

 

4.1. Общие понятия

 

Объект – это виртуальный блок памяти, который может хранить определенную информацию. Тип информации, которую может хранить объект:

·       текстовая;

·       двоичная;

·       параметрическая;

·       символы не входящие в набор ASCII.

Синтаксис описания объекта имеет следующий вид:

<ENTITY имя "содержание">

где имя – это имя, которое будет иметь объект;

содержание – значение объекта, связанное с именем.

Значение параметра "содержание" зависит от типа объекта.

 

4.2. Текстовый объект

 

Текстовый объект - это блок текста, который может часто появляться в тексте документа. В текстовый объект может и входить и фрагмент разметки. Например, в XML документе библиотечного каталога элемент author имеет обязательный атрибут country, который указывает на принадлежность автора к определенной стране. Для того, чтобы сократить запись можно использовать текстовый объект.

<!ENTITY auth_r "author country="Russian" ">

Текстовый объект может быть внутренним, как в приведенном выше примере, и внешним, например:

<!ENTITY auth_r "c:\xml\author\russia.xml" SYSTEM>

Вместо параметра SYSTEM может использоваться параметр PUBLIC. Правила использования параметров SYSTEM и PUBLIC полностью аналогичны правилам их использования в предложении DOCTYPE, которые были описаны ранее, в разделе "Внешние и внутренние DTD".

 

4.3. Двоичный объект

 

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

Признаком двоичного объекта является идентификатор NDATA. Синтаксис объявления двоичного объекта имеет следующий вид:

<!ENTITY имя "URL" SYSTEM NDATA тип_файла>

где: URL определяет местонахождение двоичного объекта;

        тип_файла – уточняет тип двоичного файла.

Например,

<!ENTITY logo "www.mysite.com/logo/logo.gif"

                           SYSTEM NDATA gif>

Поскольку анализатор может не знать, каким образом или с помощью какой программы обрабатывать двоичный объект, то ему необходимо подсказать. Для этой цели используется предложение NOTATION. Например, если для обработки gif файлов необходимо использовать программу PHOTOSHOP, то предложение NOTATION примет следующий вид:

<!NOTATION gif SYSTEM "c:\apps\graphics\photoshop.exe">

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

 

4.4. Параметрический объект

 

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

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

<!ENTITY % имя "содержание">

Например, мы хотим ввести в XML документ, описывающий библиотечный каталог, для каждой книги (элемент book) наименование издательства и картинку с логотипом этого издательства.

<book>

          <publish>… </publish>

          <logo src="www.publish.com/logo/logo.gif" border="0"

                      alt="логотип издательства" align="center" />

</book>

Поскольку значения всех атрибутов элементе logo кроме src будут повторяться для всех элементов book, то для упрощения записи можно задать параметрический объект pub_logo:

<!ENTITY % pub_logo "

          border CDATA #IMPLIED                                

          alt CDATA #IMPLIED                                          

          align (left,center,right) #REQUIRED "left"                 

          valign CDATA #FIXED "middle"

Применив pub_logo вид элемента logo будет иметь вид:

<logo src="www.publish.com/logo/logo.gif" pub_logo />      

 

4.5. Символьные и числовые объекты

 

Символьный объект – это комбинация знаков, которая должна представлять символы, не входящие в набор ASCII символов. По умолчанию XML использует кодировку ISO-Latin-1, набор символов которой шире, чем в набор ASCII символов. XML может использовать и другие кодировки. Тип кодировки указывается в командной инструкции xml, с которой всегда начинается XML документ:

<?xml version="1.0" encoding="имя кодировки"?>

Например, для того, чтобы использовать кириллицу необходимо указать кодировку Windows-1251:

<?xml version="1.0" encoding=" Windows-1251"?>

 

Кроме символов, не входящих в набор ASCII, символьные объекты используются для ряда символов, входящих в набор ASCII, но зарезервированных для специальных целей. Например,

·       амперсант "&";

·       знак меньше (открывающаяся угловая скобка) "<";

·       знак больше (закрывающаяся угловая скобка) "<".

 

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

В таблице 3 представлено несколько символьных и соответствующих им числовых объектов.

 

Специальные символы

Символьный объект

Числовой объект

"&"

&amp

&#38

"<"

&lt

&#60

">"

&gt

&#62

 

 

Используются технологии uCoz