быть восприняты, как разметка. В частности, символы <
(знак 'меньше') и &
(амперсант) вообще не могут появляться в тексте документа иначе, кроме как в виде сущностей.
<?xml version='1.0' encoding='UTF-8'?>
<advert>
<product title='слон'>
Продается серый слон весом > 5 тонн!
Компания "слон & Слон".
</product>
</advert>
На самом же деле в элементе product
заключен текст
Продается серый слон весом > 5 тонн!
Компания 'Слон & Слон'.
Довольно часто бывает необходимо использовать в документе символы набора Unicode, обращаясь к ним по десятичным или шестнадцатеричным кодам. В таких случаях можно использовать символьные сущности.
Символьная сущность (или, как ее еще называют, символьная ссылка) записывается в виде &#
или &#x
, где
— десятеричный и шестнадцатеричный Unicode-код символа в первом и втором случае соответственно.
Фраза 'Миру-мир!
' может быть записана с использованием символьных сущностей следующим образом:
&#х41С;&#х438;&#х440;&#х443; - мир!
Первое слово, 'Миру
' записано с использованием шестнадцатеричных unicode-кодов кириллицы, второе слово, 'мир
', записано с использованием десятичных кодов.
Внешние сущности содержатся во внешних файлах. Если ссылка на внешнюю сущность появляется в документе, то на ее место копируется содержимое внешнего файла.
Определение внешней сущности имеет следующий синтаксис:
<!ENTITY
В этом определении
точно так же, как и во внутренней сущности определяет имя сущности, в то время как
определяет абсолютное или относительное местоположение файла.
Предположим, что мы создали файл 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; весом > 5 тонн!
Рождественские скидки!
</product>
</advert>
В этом случае элемент product
будет иметь текст
Продается огромное серое животное весом > 5 тонн!
Рождественские скидки!
Внешняя сущность может быть также объявлена при помощи так называемого публичного идентификатора. В этом случае, при объявлении указывается не только местоположение сущности, но еще и идентификатор, который предоставляет программному обеспечению, обрабатывающему документ, некоторую дополнительную информацию. Например, в некоторых случаях XML-процессор может уже включать в себя определение внешней сущности, и ему не нужно будет получать содержимое файла, находящегося на удаленном сервере.
Такой способ определения внешней сущности имеет следующий синтаксис:
<!ENTITY
Например, сущность animal
мы можем переопределить как
<!ENTITY animal PUBLIC '-//ZOO//Elephant//Description'
'http://www.animalhost.com/animal.ent'>
Специальный процессор зоологических XML-файлов, встретив публичный идентификатор -//ZOO//Elephant//Description
поймет, что речь идет о слоне, и не станет загружать файл animal.ent
с удаленного сервера, вставив собственное описание слона.
Подводя итог, можно выделить следующие случаи, когда следует использовать сущности:
□ замена часто повторяющихся частей документа;
□ разбивка одного XML-документа на отдельные модули;
□ замена некоторых символов, которые иначе были бы восприняты, как разметка;
□ использование символов с соответствующими кодами Unicode.
Синтаксис использования сущностей в тексте документа довольно прост. Символьная сущность определяется продукцией CharRef
следующим образом:
[66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
CharRef
— это либо десятичная, либо шестнадцатеричная символьная сущность. В первом случае вместо имени сущности стоит набор, цифр от 0
до 9
, во втором — к этому набору добавляются буквы a
, b
, c
, d
, e
, f
в любом регистре символов. Ведущие нули не имеют никакого значения, &#х0020;
точно так же, как и &#х20;
соответствует пробельному символу.
Обычной сущности, объявленной внутри или вне документа, соответствует продукция EntityRef
:
[68] EntityRef ::= '&' Name
Символьная и обычная сущности объединяются в продукцию Reference
:
[67] Reference ::= EntityRef | CharRef
Здесь следует сделать небольшое отступление и сказать о том, что конструкции вида &
или &#x
, о которых мы говорили как о сущностях, на самом деле являются не сущностями, а