Выбрать главу

[60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED'

                     | (('#FIXED' S)? AttValue)

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

Для того чтобы обеспечить достаточно выразительную мощность документов, XML позволяет разбивать их на отдельные поименованные объекты, называемые сущностями. Сущности в XML не имеют ничего общего с сущностями в методологии "сущность-связь". Самый близкий аналог в традиционных языках программирования — это макроподстановка.

Существует два способа определения сущности — внутреннее и внешнее.

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

Внутреннее определение сущности имеет вид:

<!ENTITY имя "значение">

Ссылка на сущность записывается как &имя; (амперсант, затем имя сущности, затем точка с запятой).

Пример

В документе

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE advert [

 <!ENTITY animal "слон">

]>

<advert>

 <product title="&animal;">

  Продается настоящий &animal;!

 </product>

</advert>

сущность animal имеет значение "слон". Ссылка на сущность используется дважды — в атрибуте title и в тексте элемента product. Этот документ эквивалентен документу

<?xml version="1.0" encoding="UTF-8"?>

<advert>

 <product title="слон">

  Продается настоящий слон!

 </product>

</advert>

Если в будущем фирма переквалифицируется, и будет продавать, скажем, жирафов, можно будет, не изменяя всего документа, заменить только значение сущности:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE advert [

 <!ENTITY animal "жираф">

]>

<advert>

 <product title="&animal;">

  Продается настоящий &animal;!

 </product>

</advert>

Спецификация XML определяет несколько встроенных сущностей, которые перечислены в табл 1.1.

Таблица 1.1. Встроенные сущности XML

Имя сущности Значение Описание
lt < знак "меньше"
gt > знак "больше"
amp & амперсант
apos ' апостроф или одинарные кавычки
quot " двойные кавычки

Встроенные сущности могут быть использованы для замены некоторых символов там, где они могут быть восприняты, как разметка. В частности, символы < (знак "меньше") и & (амперсант) вообще не могут появляться в тексте документа иначе, кроме как в виде сущностей.

Пример

<?xml version="1.0" encoding="UTF-8"?>

<advert>

 <product title="слон">

  Продается серый слон весом &gt; 5 тонн!

  Компания &quot;слон &amp; Слон&quot;.

 </product>

</advert>

На самом же деле в элементе product заключен текст

Продается серый слон весом > 5 тонн!

Компания "Слон & Слон".

Довольно часто бывает необходимо использовать в документе символы набора Unicode, обращаясь к ним по десятичным или шестнадцатеричным кодам. В таких случаях можно использовать символьные сущности.

Символьная сущность (или, как ее еще называют, символьная ссылка) записывается в виде &#код; или &#xкод;, где код — десятеричный и шестнадцатеричный Unicode-код символа в первом и втором случае соответственно.

Пример

Фраза "Миру-мир!" может быть записана с использованием символьных сущностей следующим образом:

&#х41С;&#х438;&#х440;&#х443; - &#1084;&#1080;&#1088;!

Первое слово, "Миру" записано с использованием шестнадцатеричных unicode-кодов кириллицы, второе слово, "мир", записано с использованием десятичных кодов.

Внешние сущности содержатся во внешних файлах. Если ссылка на внешнюю сущность появляется в документе, то на ее место копируется содержимое внешнего файла.

Определение внешней сущности имеет следующий синтаксис:

<!ENTITY имя SYSTEM "URI">

В этом определении имя точно так же, как и во внутренней сущности определяет имя сущности, в то время как URI определяет абсолютное или относительное местоположение файла.

Пример

Предположим, что мы создали файл animal.ent со следующим содержанием:

огромное серое животное

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

<!ENTITY animal SYSTEM "ent/animal.ent">

где ent/animal есть относительный путь до файла animal.ent. Если бы мы расположили файл на сервере, скажем, www.animalhost.com, сущность могла бы быть объявлена как

<!ENTITY animal SYSTEM "http://www.animalhost.com/animal.ent">

В документе ссылаться на объявленную внешнюю сущность мы будем точно так же, как ссылались бы на внутреннюю сущность:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE advert [

 <!ENTITY animal SYSTEM "ent/animal.ent">

]>

<advert>

 <product title="слон">

  Продается &animal; весом &gt; 5 тонн!

  Рождественские скидки!

 </product>

</advert>

В этом случае элемент product будет иметь текст

Продается огромное серое животное весом > 5 тонн!

Рождественские скидки!

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