ENTITY (XML)
Инструкция ENTITY используется для определения сущностей в DTD с целью их использования как в связанном с DTD XML-документе, так и собственно в DTD. ENTITY представляет собой сокращенную запись для размещения в XML-документе. Сокращенное имя указывается для имени параметра. Инструкции ENTITY особенно полезны в ситуациях, когда требуется повторять сведения или использовать объемные текстовые блоки, которые можно хранить в отдельных файлах. В XML-документе за сокращенным именем следует символ точки с запятой (&abbName;)
Далее приведен пример инструкций ENTITY, используемых в DTD и в XML-файлах.
longtext.txt
Ниже приведено содержимое файла longtext.txt:
<definition>ATTLIST(attribute list) Declares a list of XML attributes. These attributes are qualified by name, data type, implied default values, and the name of any elements that permit their use.
</definition>
dtd_chunk.dtd
<!ELEMENT list >
<!ATTLIST list list_type (ul | ol)>
sample.dtd
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE dtd_sample[
<!ELEMENT file_info>
<!ATTLIST file_info name #REQUIRED>
<!ENTITY xml "eXtensible Markup Language">
<!ENTITY attlist_def SYSTEM "longtext.txt">
<!ENTITY % lists "(ol | ul)">
<!ENTITY % dtd_chunk SYSTEM "chunk.dtd">
<!ENTITY file_pic SYSTEM "file.jpg" NDATA jpg>
<!NOTATION jpg SYSTEM "image/jpeg">
%dtd_chunk;
<!ELEMENT icon EMPTY>
<!ATTLIST icon source ENTITY #REQUIRED>
<!ATTLIST icon list_type &lists;>
]>
В результате анализа DTD-документа выводятся следующие результаты. Обратите внимание, что замена происходит только в памяти. Средство синтаксического анализа не вносит в файл никаких изменений.
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE dtd_sample[
<!ELEMENT file_info>
<!ATTLIST file_info name #REQUIRED>
<!ENTITY xml "eXtensible Markup Language">
<!ENTITY attlist_def SYSTEM "longtext.txt">
<!ENTITY % dtd_chunk SYSTEM "chunk.dtd">
<!ENTITY file_pic SYSTEM "file.jpg" NDATA jpg>
<!NOTATION jpg SYSTEM "image/jpeg">
<!ELEMENT list >
<!ATTLIST list list_type (ul | ol)>
<!ELEMENT icon EMPTY>
<!ATTLIST icon source ENTITY #REQUIRED>
<!ATTLIST icon list_type (ol | ul)>
]>
sample.xml
<?xml version="1.0" standalone="no" ?>
<heading>Definition list for &xml; attributes used in DTD files.</heading>
<file_info name="topfile">
<icon source="file_pic"/>
<list list_type="ul"/>
%attlist_def
</file_info>
<footer>Conclusion of definition list for &xml; attributes.</footer>
Результаты синтаксического анализа XML-документа
В результате анализа XML-документа выводятся следующие результаты:
Definition list for eXtensible Markup Language attributes used in DTD files.
top file
ATTLIST(attribute list) Declares a list of XML attributes. These attributes are qualified by name, data type, implied default values, and the name of any elements that permit their use.
Conclusion of definition list for eXtensible Markup Language attributes.
Синтаксис
<!ENTITY [%] name [SYSTEM|PUBLIC publicID] resource [NDATA notation] >
Параметры
имя
Имя сущности. Обязателен для всех определений сущностей.publicID
Общий идентификатор для сущности. Требуется лишь в том случае, если в объявлении используется ключевое слово PUBLIC.ресурс
Значение сущности. Обязателен для всех определений сущностей. В случае внутренних сущностей это текстовая строка, которая подвергается анализу и расширяется. В случае внешних сущностей это идентификатор URI, идентифицирующий внешнюю сущность, например имя файла или тип файла.нотация
Имя нотации, объявленное в других частях DTD с помощью инструкции NOTATION. Требуется только при объявлении неанализируемой сущности с использованием ключевого слова NDATA, которое обозначает данные в формате, отличном от XML.
Примеры
Общая сущность (проанализированная внутренняя)
Ниже следует объявление внутренней общей сущности, к которой можно обращаться как к öaut; или к &xml; в XML-документах, где используется DTD.
<!ENTITY oumlaut "&#246;">
или простой пример замены текста:
<!ENTITY xml "eXtensible Markup Language">
Средство синтаксического анализа XML расширяет необработанное значение сущности (&#246;), чтобы превратить его в часть внутреннего XML-документа. В окончательной версии проанализированного документа значение "&" используется для формирования символа "&" и значение включается в XML-документ в виде "ö".
Cущность-параметр (проанализированная внутренняя)
Ниже следует объявление внутренней сущности-параметра, к которой можно обращаться как к %lists; в других частях DTD. Это допускает повторные ссылки на XHTML-список элементов <ul> и <ol>.
<!ENTITY % lists "ul | ol">
Непроанализированная внешняя сущность
Далее следует объявление непроанализированной внешней сущности, позволяющей кодировать ссылки на данные в форматах, отличных от XML (в данном случае на файл изображения в формате GIF) для включения этих данных в XML-документ.
<!ENTITY file_pic SYSTEM "file.jpg" NDATA jpg>
В данном случае применение ключевого слова NDATA подразумевает необходимость использования объявления NOTATION для нотации «jpg» в сочетании с этим объявлением. Дополнительные сведения см. в разделе НОТАЦИЯ.
Примечания
Инструкции ENTITY можно использовать разными способами. Если вы не знаете, как определять сущности для последующего использования, возможно, следующие вопросы помогут лучше разобраться в тех условиях, в которых используются сущности, объявляемые в DTD.
Будет ли значение сущности использоваться просто для сокращения более длинной текстовой строки, которая может изменяться в течение жизни документа? В этом случае нужно использовать общую сущность.
Будет ли оно использоваться в качестве указателя на объекты, внешние по отношению к DTD или к XML-документу (т. е. внешние сущности), такие как имя файла или тип MIME? В этом случае необходимо использовать неанализируемую внешнюю сущность.
Следует ли анализировать значение URI сущности (т. е. представлять как часть DTD- или XML-документа, использующего его) или не анализировать (т. е. средство синтаксического анализа XML не будет включать его содержимое в окончательный документ)?
Если предполагается проведение анализа, должно ли расширенное содержимое сущности стать частью XML-документа, использующего DTD (т. е. быть обычными сущностями) либо являться частью самого DTD (т. е. сущностями-параметрами)?