Разделы XML-документа
Физически XML-документ может состоять из несколько разделов (entities). При этом корневой элемент документа также является разделом, который называется разделом документа, хотя он никак специально не оформлен. Все разделы имеют содержимое; все они, кроме раздела документа и внешней DTD, имеют имя.
С точки зрения синтаксического разбора документа разделы подразделяются на анализируемые и неанализируемые. Неанализируемый раздел (unparsed entity) – это ресурс, содержимое которого XML-процессор воспринимает как внешние данные без их синтаксического анализа (например, текст, не являющийся XML-документом). Неанализируемые разделы всегда имеют нотацию, указывающую на их формат. Анализируемые разделы (parsed entities) предназначены для текстовой подстановки: всякий раз, когда XML-процессор встречает в документе имя такого раздела, он заменяет его на содержимое этого раздела.
Внутренние разделы
Декларации разделов подразделяются на внутренние и внешние. Декларация внутреннего разделавыглядит так:
<!ENTITY имя значение>
Она включает в себя содержимое объекта (параметр значение) и используется для подстановки этого значения вместо имени раздела. Мы можем, например, ввести в пример с книгами атрибут жанр и использовать для задания жанра внутренние разделы:
<!DOCTYPE spec [ <!ENTITY pr "проза"> <!ENTITY po "поэзия">]>
<books>
<book genre="&science;">
<title>Системы искусственного интеллекта</title>
<author>Федоров, Евгений</author>
</book> <book genre="&lections;">
<title>Введение в Semantic Web</title>
<author>Бабаков, Роман</author>
</book>
</books>
Из этого примера видно, что ссылка на раздел (entity reference) выглядит точно так же, как ссылка на специальный символ, т. е. имеет вид &имя;. На самом деле, специальные символы – это точно такие же ссылки, но соответствующие разделы заданы неявно во внутренней декларации языка XML. Подобные текстовые подстановки удобны для задания сокращений, позволяющих уменьшить объем документа, и для введения обозначений для часто изменяемых полей документа. Так, например, мы можем вынести во внутренний раздел дату очередной ревизии публикации и затем изменять только значение этого раздела.
Внешние разделы
Существуют два варианта деклараций внешнего раздела:
<!ENTITY имя SYSTEM URI [NDATA нотация]?>
<!ENTITY имя PUBLIC строка? URI [NDATA нотация]?>
Первый вариант называется системным разделом, второй – публичным разделом. Они оба связывают имя раздела с внешним ресурсом, заданным своим URI, который должен иметь кодированную форму и не содержать закладок. URI внешнего ресурса называется системным идентификатором раздела. Использование внешнего ресурса зависит от нескольких факторов:
- Если декларация содержит параметр NDATA, задающий нотацию раздела, то раздел является неанализируемым.
- Если параметр NDATA не задан, то раздел анализируемый, и соответствующий ресурс должен быть XML-документом. Это означает, что вместо ссылки на раздел в текст документа будет включаться текст соответствующего ресурса.
- Публичный раздел может содержать строку, задающую публичный идентификатор раздела. XML-процессор может использовать этот идентификатор для генерации альтернативного URI данного раздела. Если ему это не удалось, то он должен использовать системный идентификатор для загрузки содержимого раздела.
Примеры деклараций внешних ресурсов:
<!-- неанализируемый ресурс: GIF-образ -->
<!ENTITY photo SYSTEM "images/photo.gif" NDATA gif>
<!-- системный анализируемый ресурс -->
<!ENTITY hatch SYSTEM "http://www.textuality.com/boilerplate/hatch.xml">
<!-- публичный анализируемый ресурс -->
<!ENTITY hatch PUBLIC "-//Textuality//TEXT Standard hatch boilerplate//EN"
"http://www.textuality.com/boilerplate/hatch.xml">
Внешний анализируемый раздел должен начинаться с директивы <?xml …?>, которая может не содержать номера версии, но обязана содержать кодировку символов. Эта директива не входит в состав подставляемого текста.
Декларация типа документа
Декларация типа XML-документа (document type declaration) содержит определение типа документа(document type definition, DTD) или указывает на него. DTD — это специальная грамматика, описывающая синтаксис определенного класса документов; правила создания DTD стандартизованы, но использование DTD не рекомендовано W3C, т.к. разработана альтернатива – XSLT. Здесь приводится только описание деклараций, которые обеспечивают доступ к DTD. Декларация типа документа, как и декларация раздела, может быть внутренней или внешней. Внутренняя декларация имеет вид:
<!DOCTYPE имя [ тело ]>
а внешняя — те же два варианта, что и внешние разделы:
<!DOCTYPE имя SYSTEM URI [ тело ]>
<!DOCTYPE имя PUBLIC строка? URI [ тело ]>
Таким образом, отличие декларации типа документа от декларации раздела состоит только в том, что:
- она начинается с ключевого слова !DOCTYPE, а не !ENTITY;
- она может иметь тело, заключенное в квадратные скобки.
Имя такой декларации должно совпадать с именем корневого элемента, который она описывает, а тело должно соответствовать правилам построения DTD. Примеры внешних деклараций:
<!DOCTYPE spec SYSTEM "xml/1998/06/xmlspec-v20.dtd">
<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.0//EN"
"/XML/1998/06/xmlspec-v20.dtd">
Отметим, что внешняя декларация типа документа может содержать и ссылку на DTD, которая называется внешним подмножеством DTD, и тело, которое описывает дополнения к внешней DTD (оно называется внутренним подмножеством DTD).
Пример XML-документа. Чтобы собрать рассмотренные выше понятия в единое целое, приведем пример готового XML-документа, содержащего прейскурант книжного магазина:
<?xml version='1.0' encoding="windows-1251" standalone="yes"?>
<!DOCTYPE bookstore [
<!ENTITY po "поэзия">
<!ENTITY pr "проза">
<!ENTITY dr "драматургия"> ]>
<!--Этот файл содержит фрагмент базы данных книжного магазина-->
<bookstore>
<book genre="≺">
<title>Марш обреченных</title>
<author>
<first-name>Сергей</first-name>
<last-name>Довлатов</last-name>
</author>
<price>60.00</price>
</book>
<book genre="&po;">
<title>Часть речи</title>
<author>
<first-name>Иосиф</first-name>
<last-name>Бродский</last-name>
</author>
<price>55.00</price>
</book>
<book genre="&dr;">
<title>Антигона</title>
<author>
<name>Софокл</name>
</author>
<price>103.50</price>
</book>
</bookstore>
Таким образом, в общем случае XML-документы должны удовлетворять следующим требованиям:
- В заголовке документа помещается объявление XML, в котором указывается язык разметки документа, номер его версии и дополнительная информация.
- Каждый открывающий тэг, определяющий некоторую область данных в документе обязательно должен иметь своего закрывающего «напарника», т.е., в отличие от HTML, нельзя опускать закрывающие тэги.
- В XML учитывается регистр символов.
- Все значения атрибутов, используемых в определении тэгов, должны быть заключены в кавычки.
- Вложенность тэгов в XML строго контролируется, поэтому необходимо следить за порядком следования открывающих и закрывающих тэгов.
- Вся информация, располагающаяся между начальным и конечными тэгами, рассматривается в XML как данные и поэтому учитываются все символы форматирования ( т.е. пробелы, переводы строк, табуляции не игнорируются, как в HTML).
Если XML-документ не нарушает приведенные правила, то он называется формально-правильным и все анализаторы, предназначенные для разбора XML- документов, смогут работать с ним корректно.
Лекция 6
Дата добавления: 2015-12-08; просмотров: 730;