Примитивами (сущностями, ENTITY) в XML называются данные или часть данных, например: сам XML-файл; сам DTD- файл; файл, определённый в DTD- файле как внешний примитив; строка в кавычках, определенная как внутренний примитив в DTD и допускающая использование посредством ссылки.
Внутренний примитив (internal entities)
Для использования в тексте XML-файла отдельных фраз или специальных символов их определяют как внутренний примитив в DTD(или XML)файле, а затем используют ссылки на замещающие их сущности в тексте XML-файла. Ссылка на сущность содержит имя сущности, знак амперсанд (&) перед именем и заканчивается точкой с запятой. Например:
&surname;
Предварительно в DTD - файле с именем filename.dtd в строке!DOCTYPE для XML-файла с именем ARTICLE указывается имясущности (title, tm) и её определение (текст сущности: A short History of XML и ™ соответственно) в квадратных скобках ([]). Например:
<!DOCTYPE ARTICLE
[
…
<!ENTITY title "A short History of XML">
<!ENTITY tm " ™ " >
]
Также можно объявлять ссылки на сущности, которые в DTD будут заменяться определениями сущности. Такой тип сущностей называется параметрическим (parameter entity), т.е. это сущности, которые используются только внутри описания DTD. При этом перед именем сущности ставится знак (%), отделённый пробелами.
<! ENTITY % cdata "#CDATA">
Ссылка на параметрическую сущность не может присутствовать внутри документа XML — только в DTD, где она определяется. При этом ссылка на параметрическую сущность начинается не с амперсанда (&), а со знака (%):
%cdata;
Внутренний примитив (сущность) можно задать в самом XML-файле с именем ARTICLE. Например:
<!DOCTYPE ARTICLE SYSTEM "filename.dtd" [ <! ENTITY surname " Алексей Георгиевич"]>
Внешний примитив (external entities)
Для использования в тексте XML-файла данных другого файла Topics.xml нужно этот файл определить как внешний примитив в DTDфайле filename.dtd:
<!DOCTYPE ARTICLE
[
…
<!ENTITY topics SYSTEM "Topics.xml">
…
]
Здесь topics - имя примитива (ссылка на сущность). Topics.xml – системный литерал, который описывает местонахождение файла, содержащего данные примитива. Системный литерал может быть ограничен одинарными (') или двойными (") кавычками и содержать любые символы, кроме символа кавычек, используемого как ограничители.
Системный литерал задает унифицированный идентификатор ресурса (URI) файла, содержащего данные примитива. На сегодняшний день URI практически то же самое, что стандартный Internet-адрес, известный как унифицированный указатель ресурса (URL).
Можно использовать либо полный URI, например:
<!ENTITY topics SYSTEM "http://bogus.com/documents/Topics.xml ">
либо частичный URI, который задает местонахождение относительно местонахождения XML-документа, содержащего URI, как в примере:
<!ENTITY topics SYSTEM "Topics.xml">
После объявления внешней сущности можно включить содержимое указанного документа Topics.xml в документ ARTICLE.xml, используя ссылку на сущность – в данном случае &topics;
Относительные URI в XML-документах работают аналогично относительным URL для HTML-страниц.
Кроме деления примитивов (ENTITY) на внутренние и внешние, параметрические и непараметрические они ещё делятся на разбираемые (parsed) и неразбираемые (unparsed) программой-анализатором.
Разбираемый примитив содержит XML-текст (символьные данные, разметка или то и другое). Когда вы вставляете ссылку на разбираемый примитив в документ, ссылка замещается содержимым примитива (замещающий текст), который становится составной частью документа. Синтаксический анализатор XML разбирает (сканирует) содержимое примитива точно так же, как он сканирует непосредственно введенный в документ текст. Рассмотренные в примерах примитивы являются разбираемыми примитивами.
Неразбираемый примитив может содержать любой тип данных: XML-данные или, что чаще, не XML-данные. Не XML-данные могут представлять собой либо текстовые данные (например, название) или не текстовые данные (например, графические данные для изображения). Поскольку неразбираемый примитив обычно не содержит XML, его содержимое нельзя непосредственно вставить в документ посредством ссылки на примитив. Тем не менее, вы можете связать с именем примитива атрибут типа ENTITY или ENTITIES, чтобы приложение получило доступ к имени примитива и его описанию, а также могло работать с его данными.
Например, DTD в следующем XML-документе определяет файл Faun.gif (который содержит рисунок обложки книги) как общий внешний неразбираемый примитив с именем faun. Имя нотации (NOTATION)этого примитива – GIF. Нотация указывает на местонахождение программы, которая отображает графические файлы в формате GIF (ShowGif.exe). DTD также определяет пустой элемент с именем COVERIMAGE и атрибут типа ENTITY для этого элемента с именем Source:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE BOOK
[
<!ELEMENT BOOK (TITLE, AUTHOR, COVERIMAGE)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT AUTHOR (#PCDATA)>
<!ELEMENT COVERIMAGE EMPTY>
<!ATTLIST COVERIMAGE Source ENTITY #REQUIRED>
<!NOTATION GIF SYSTEM "ShowGif.exe">
<!ENTITY faun SYSTEM "Faun.gif" NDATA GIF>
]>
В элементе Документ атрибуту Source элемента COVERIMAGE присвоено имя внешнего примитива, который содержит графические данные для отображения рисунка обложки. Поскольку Source имеет тип ENTITY, ему можно присвоить имя общего внешнего неразбираемого примитива. Фактически единственный способ использования этого типа примитива состоит в присвоении его имени атрибуту с типом ENTITY или ENTITIES.
<BOOK>
<TITLE>The Marble Faun</TITLE>
<AUTHOR>Nathaniel Hawthorne</AUTHOR>
<COVERIMAGE Source="faun" />
</BOOK>
Использование сущностей помогает избежать многократного повторения одной и той же фразы или информации в документе XML.
Выводы:
В данном вопросе изучили основы применения примитивов в XML документах
Заключение
Итак, документ XML состоит из нескольких конструкций: пролога, элементов со своими атрибутами и содержимым, инструкций по обработке, секций CDATA, ссылок на сущности, комментариев.
Основное отличие XML от HTML – он разделяет структуры данных от стилей и содержания, которые определяют структуру документа. В этом заключается гибкость использования XML. Сегодня XML может использоваться в любых приложениях, которым нужна структурированная информация - от сложных геоинформационных систем, с гигантскими объемами передаваемой информации до обычных "однокомпьютерных" программ, использующих этот язык для описания служебной информации. При внимательном взгляде на окружающий нас информационный мир можно выделить множество задач, связанных с созданием и обработкой структурированной информации, для решения которых может использоваться XML:
Вопросы для самоконтроля
1. Что значит "верный" документ?
2. Обязателен ли пролог документа XML?
3. Обязателен ли корневой элемент?
4. Найдите ошибки в записи элемента
< Support id=1234 > SD > 12xz </ support >.
5. Верна ли запись
< item selected > Спички </ item >?
6. Какими способами можно записать символ "меньше" в содержимом элемента?
7. Можно ли использовать одинаковые имена во вложенных элементах, если данные имена вложены в разные элементы?
8. Можно ли записать атрибуты в закрывающем теге?
9. Как указать порядок следования вложенных элементов?
10. Как объявляются атрибуты элемента?
11. Что такое сущность в языке XML?
12. Чем отличаются внутренние и внешние сущности?
13. Для чего нужны параметризованные сущности?
Литература
1. Хабибуллин И. Ш. Самоучитель XML. - СПб.: БХВ-Петербург, 2003. - 336 с: ил.
В.В. Котович