<!ELEMENT menu (menuitem*)>
<!ELEMENT menuitem EMPTY>
<!ATTLIST menuitem
image ENTITY #REQUIRED
title CDATA #REQUIRED
href CDATA #REQUIRED>
<!NOTATION gif SYSTEM 'gif-viewer.exe'>
<!NOTATION jpg SYSTEM 'jpg-viewer.exe'>
<!ENTITY news SYSTEM 'news.gif' NDATA gif>
<!ENTITY products SYSTEM 'prod.jpg' NDATA jpg>
<!ENTITY support SYSTEM 'support.gif' NDATA gif>
]>
<menu>
<menuitem image='news' title='News' href='news.htm'/>
<menuitem image='products' title='Products' href='prods.htm'/>
<menuitem image='support' title='Support' href='support.htm'/>
</menu>
Проанализируем декларацию типа этого документа.
□ Декларация типа <!DOCTYPE menu [..] >
говорит о том, что корневым элементом этого документа является элемент menu
.
□ В соответствии с определением <!ELEMENT menu (menuitem* )>
этот элемент состоит из нескольких субэлементов menuitem
.
□ В соответствии с определением <!ELEMENT menuitem EMPTY>
элемент menuitem
должен быть пустым.
□ Запись <!ATTLIST menuitem ... >
определяет в элементе menuitem
следующие атрибуты:
• обязательный атрибут image
, в котором должно указываться имя сущности;
• обязательный атрибут title
, содержащий символьные данные;
• обязательный атрибут href
, содержащий символьные данные.
□ Запись <!NOTATION gif SYSTEM 'gif-viewer.exe'>
определяет нотацию с именем gif
и закрепляет за ней приложение gif-viewer.exe
.
□ Запись <!NOTATION jpg SYSTEM 'jpg-viewer.ехе'>
определяет нотацию с именем jpg
и закрепляет за ней приложение jpg-viewer.exe
.
□ Запись <!ENTITY news SYSTEM 'news.gif' NDATA gif>
определяет внешнюю неразбираемую сущность с именем news
, которая имеет формат (нотацию) gif
.
□ Запись <!ENTITY products SYSTEM 'prod.jpg' NDATA jpg>
определяет внешнюю неразбираемую сущность с именем products
, которая имеет нотацию jpg
.
□ Запись <!ENTITY support SYSTEM 'support.gif' NDATA gif>
определяет внешнюю неразбираемую сущность с именем support
, которая имеет нотацию gif
.
Посмотрим теперь, какую информацию нам дают такие громоздкие определения. Обратимся к записи одного из элементов menuitem
:
<menuitem image='products' title='Products' href='prods.htm'/>
С атрибутами title
и href
все ясно: они содержат простые символьные данные. Атрибут image
несколько сложнее, он предоставляет гораздо больше информации. Типом этого атрибута является ENTITY
, значит текст, который он содержит, является не просто символьными данными: он задает имя сущности, связанной с данным атрибутом. Иначе говоря, с атрибутом image
связывается сущность.
Анализируя определение сущности products
, обрабатывающая программа может понять, что это — неразбираемая внешняя сущность формата jpg
, которая хранится в файле prod.jpg
и для обработки которой можно использовать приложение jpg- viewer.exe
.
Вторым способом использования нотаций является присвоение определенного формата содержимому элемента. Один (но не более чем один) из атрибутов элемента может иметь тип NOTATION
. Значением этого атрибута должно быть имя нотации, которое и будет задавать формат содержимого элемента.
<!DOCTYPE root [
<!ELEMENT root (#PCDATA)>
<!ATTLIST root
type NOTATION (rtf|htm|txt) #REQUIRED>
<[NOTATION rtf SYSTEM 'winword.exe'>
<!NOTATION htm SYSTEM 'iexplore.exe'>
<!NOTATION txt SYSTEM 'notepad.exe'>
]>
<root type='htm'>
<![CDATA[
<html>
<head>
...
</head>
<body>
...
</body>
</html>]]>
</root>
В этом документе определяется три нотации, три формата данных: rtf
, htm
и txt
. Атрибут type
элемента root
указывает формат данных, которые содержатся в этом элементе — в данном случае это 'htm'
(что, очевидно, соответствует HTML-документу).
Несмотря на то, что нотации являются довольно мощным механизмом, ввиду очевидной сложности, широкого распространения их использование не получило. Почти того же самого эффекта можно добиться более простыми способами, например, используя в элементах дополнительные атрибуты.
Символьные данные в XML-документах
Каковы бы ни были структура и синтаксис текстового документа, основой его всегда являются символы. Для хранения и обработки текста на компьютерах, которые по своей природе являются цифровыми устройствами, каждому символу нужно поставить в соответствие числовой код.
Проблема многих языков заключается в том, что для них существует несколько альтернативных кодировок символов. Например, для кириллицы существуют такие кодировки, как CP-866, KOI8-R, CP-1251,