Г.Е. Берман (berman@tversu.ru)
3.5. Пример описания атрибутов
4.5. Символьные и числовые объекты
Данный документ представляет собой лекцию по курсу «XML технологии» и описывает назначение, правила использования и синтаксис DTD (Document Type Definition – Описание Типа Документов).
Все XML документы можно разделить на две группы:
·
Правильные (well-formed);
·
Состоятельные (valid).
Правильные документы должны удовлетворять требованиям синтаксиса XML документов:
· теги должны быть парными;
· обязательно должен быть корневой тег;
· вложенность элементов должна быть корректной.
Более подробно требования, предъявляемые к правильным документам, рассмотрены в предыдущей лекции «Общее описание XML документов».
Состоятельный документ это правильный документ, все компоненты которого должны удовлетворять определенным правилам, задаваемым в 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>
XML
документ состоит из набора тегов. С
точки зрения DTD все теги, представленные в XML документе являются элементами и
должны быть соответствующим образом описаны.
Теги XML документа
могут быть двух типов:
·
контейнерные,
представляются парой тегов (начальный и конечный);
·
пустые,
представляются одиночным тегом. Признаком пустого тега является слеш перед
закрывающейся угловой скобкой.
Контейнерный тег
хранит в себе текст или другие теги. В примере, описывающем библиотечный
каталог, все теги контейнерные. Так тег <book> является контейнерным,
поскольку хранит в себе другие теги <title> и <author>.
Соответственно теги <title> и <author> являются контейнерными,
поскольку хранят в себе текст: название книги и имя автора.
Пустые теги не могут содержать в себе текст или другие теги. Обычно они используются для включения объектов. Что такое объекты, и какие виды объектов существуют, описывается в разделе «Объекты» данного документа. Здесь, в качестве примера, покажем, как можно включить в текст XML документа такой объект, как графический файл:
<image file="c:\image\image.gif" />
Элементы в DTD
объявляются с помощью предложения, которое имеет следующий формат:
<!ELEMENT имя_тега>
Для XML документа, описывающего библиотечного
каталог, фрагмент DTD, в котором объявляются элементы будет иметь следующий
вид:
<!ELEMENT library>
<!ELEMENT book>
<!ELEMENT title>
<!ELEMENT name>
Примечание. Данный фрагмент объявления включает описание
элементов без учета правил вложенности. Описание этих правил представлено в
документе «Описание контейнерной структуры XML документов», который находится по адресу homepages.tversu.ru/~berman/dtd/cont/conteiner.htm
Элементы описывают
основные понятия предметной области. Атрибут уточняет информацию об этом
понятии. Он позволяет понять, какая информация связана с элементами и, самое
главное, контролировать тип этой информации.
Например, возьмем
элемент 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>
Преимущество использования
атрибутов состоит в том, как мы увидим далее, что они позволяют контролировать
свои значения, чего нельзя достичь, используя только элементы.
Существует три типа
атрибутов:
·
обязательные;
·
фиксированные;
·
неявные.
Обязательные атрибуты (уже видно из их названия) – это атрибуты,
которые всегда должны быть определены для данного типа элемента. В противном
случае анализатор будет считать документ не состоятельным и выдаст ошибку во
время его синтаксического анализа.
Фиксированные атрибуты – это такие атрибуты значения которых
разработчик XML документа не может изменять. Для таких атрибутов можно
использовать либо конкретно указанное значение, либо одно из возможных
значений. Фиксированные атрибуты могут иметь значение по умолчанию. В этом
случае их в тегах XML документа указывать не обязательно, автоматически будут
приняты значения по умолчанию.
Неявные атрибуты – это не обязательные и не фиксированные,
т.е. все атрибуты, которые не подходят под определение обязательных и
фиксированных атрибутов. Неявные атрибуты не имеют значения по умолчанию и не
обязаны всегда появляться вместе с элементом к которому они относятся.
Определение типов атрибутов. В DTD типы атрибутов задаются специальными идентификаторами, значение которых представлены в таблице 1.
Табл. 1
Тип атрибута |
Идентификатор |
Обязательный |
#REQUIRED |
Фиксированный |
#FIXED |
Неявный |
#IMPLIED |
Атрибуты могут
принимать следующие значения:
·
простой текст;
·
уникальный
идентификатор;
·
предопределенное
значение;
·
объект.
Простой текст – это строки текста, задаваемые
разработчиком. Значения неявных атрибутов, как правило, именно простой текст.
Например, мы хотим
для книг библиотечного каталога ввести атрибут – адрес сайта издательства в
Интернет.
<book site= www.booksite.com>
Тип значения
атрибута – простой текст.
Уникальный идентификатор – это текстовая строка, уникально
идентифицирующая определенный элемент, которая имеет следующий формат:
ID=
"уникальный_идентификатор"
Обычно уникальный
идентификатор используется в том случае, когда применяются таблицы стилей,
чтобы связать элемент с определенным стилем. В XML нет никаких правил, как
назначать значения уникальному идентификатору. Единственное ограничение –
должен начинаться с алфавитно-цифрового символа.
Предопределенное значение – это множество заранее определенных
значений только одно, из которых может выбрать разработчик XML документа для
присвоения атрибуту. Одно из значений множества может использоваться как
значение по умолчанию.
Например, в HTML
атрибут ALIGN, отвечающий за расположение текста на строке может принимать
только одно из трех предопределенных ему значений {LEFT, CENTER, RIGHT}.
Достоинство
использования предопределенных значений атрибута заключается в том, что они
дают дополнительный уровень контроля, гарантируя установку правильное значение.
Объект – это виртуальный блок памяти, который может хранить определенную
информацию. До того, как объект будет включен в XML документ, он должен быть
объявлен, используя определенное объявление. Более подробно типы объектов и их
объявления будут описаны далее в разделе "Объекты".
Синтаксис объявления
атрибутов имеет следующий формат:
<!ATTLIST имя_элемента имя_атрибута
тип_значения тип_атрибута
"значение_по_умолчанию"
С одним элементом
может связано несколько атрибутов, поэтому все параметры, кроме имя_элемента,
могут повторяться.
В предложении
ATTLIST тип значения атрибута представлен идентификаторами, значения которых
даны в таблице 2.
Табл.2.
Тип |
Иденификатор |
Простой текст |
CDATA |
Уникальный
идентификатор |
ID |
Предопределенное
значение |
(значение |
значение |…|значение |
Нетекстовый объект |
ENTITY |
Допустим, в
используемом нами 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. В примере этого атрибута нет, но
поскольку он фиксированный, то используется неявно, и представляется своим
значением по умолчанию.
Объект – это
виртуальный блок памяти, который может хранить определенную информацию. Тип
информации, которую может хранить объект:
·
текстовая;
·
двоичная;
·
параметрическая;
·
символы не входящие
в набор ASCII.
Синтаксис описания
объекта имеет следующий вид:
<ENTITY имя "содержание">
где имя – это имя,
которое будет иметь объект;
содержание –
значение объекта, связанное с именем.
Значение параметра
"содержание" зависит от типа объекта.
Текстовый объект - это
блок текста, который может часто появляться в тексте документа. В текстовый
объект может и входить и фрагмент разметки. Например, в XML документе
библиотечного каталога элемент author имеет обязательный атрибут country,
который указывает на принадлежность автора к определенной стране. Для того,
чтобы сократить запись можно использовать текстовый объект.
<!ENTITY auth_r "author
country="Russian" ">
Текстовый объект
может быть внутренним, как в приведенном выше примере, и внешним, например:
<!ENTITY auth_r
"c:\xml\author\russia.xml" SYSTEM>
Вместо параметра
SYSTEM может использоваться параметр PUBLIC. Правила использования параметров
SYSTEM и PUBLIC полностью аналогичны правилам их использования в предложении
DOCTYPE, которые были описаны ранее, в разделе "Внешние и внутренние
DTD".
Двоичный объект – это
обычно внешний объект, который определяет двоичный файл (графический файл, файл
мультимедиа, исполняемую программу и т.п.).
Признаком двоичного
объекта является идентификатор 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 задавать не надо.
Параметрический объект –
предназначен для хранения списков атрибутов и моделей содержания. Если
несколько разных элементов имеют одинаковые списки атрибутов, то для того,
чтобы каждый раз не задавать их, можно воспользоваться параметрическим
объектом.
Синтаксис объявления
параметрического объекта имеет следующий вид:
<!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 />
Символьный объект – это
комбинация знаков, которая должна представлять символы, не входящие в набор
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 представлено
несколько символьных и соответствующих им числовых объектов.
Специальные
символы |
Символьный объект |
Числовой объект |
"&" |
& |
& |
"<" |
< |
< |
">" |
> |
> |