суббота, 28 августа 2010 г.

Структура XML-документа

XML-документ состоит из деклараций, элементов, комментариев, специальных символов и директив.

1. Элементы и атрибуты

XML — это теговый язык разметки документов. Иными словами, любой документ на языке XML представляет собой набор элементов, причем начало и конец каждого элемента обозначается специальными пометками, называемыми тегами. То есть, как и HTML, язык XML для описания данных использует тэги. Но, в отличие от HTML, XML позволяет использовать неограниченный набор пар тэгов, каждая из которых представляет не то, как заключенные в нее данные должны выглядеть, а то, что они означают.

Элемент состоит из трех частей: начального тега, содержимого и конечного тега. Тег — это текст, заключенный в угловые скобки "<" и ">". Конечный тег имеет то же имя, что начальный тег, но начинается с косой черты "/". Пример XML-элемента:

<author>Сергей Довлатов</author>


Имена элементов зависят от регистра, т. е. <author>, <Author> и <AUTHOR> — это имена различных элементов. Наличие закрывающего тега всегда обязательно. Если тег является пустым, т. е. не имеет содержимого и закрывающего тега, то он имеет специальную форму:



<элемент/>


Любой элемент может иметь атрибуты, содержащие дополнительную информацию об элементе. Атрибуты всегда включаются в начальный тег элемента и имеют вид:



имя_атрибута="значение_атрибута"


Аттрибут обязан иметь значение, которое всегда должно быть заключено в одинарные или двойные кавычки. Имена атрибутов также зависят от регистра. Пример элемента, имеющего атрибут:



<author country="USA">Сергей Довлатов</author>


Элементы должны либо следовать друг за другом, либо быть вложены один в другой:



<books>


  <book isbn="5887821192">


    <title>Часть речи</title>


    <author>Бродский, Иосиф</author>


    <present/>


  </book>


  <book isbn="0345374827">


    <title>Марш одиноких</title>


    <author>Довлатов, Сергей</author>


    <present/>


  </book>


</books>


Здесь элемент books (книги) содержит два вложенных элемента book (книга), которые, в свою очередь, имеют атрибут isbn и содержат три последовательных элемента: title (название), author (автор) и present (есть в наличии), причем последний пуст, т. к. в данном случае соответствует логическому флажку.



Из приведенного описания видно, что синтаксис XML напоминает синтаксис HTML (что естественно, т. к. оба они являются диалектами одного языка SGML), но требования к оформлению правильных XML-документов выше. Еще одним очень важным отличием XML от HTML является то, что содержимое элементов, т. е. все, что содержится между начальным и конечным тегами, считается данными. Это означает, что XML не игнорирует символы пробела и разрыва строк, как это делает HTML.



2. Пролог и директивы


Любой XML-документ состоит из пролога и корневого элемента, например:



<?xml version="1.0"?>


<books>


  <book isbn="0345374827">


    <title>Марш одиноких</title>


    <author>Довлатов, Сергей</author>


    <present/>


  </book>


</books>


В этом примере пролог сводится к единственной директиве (первая строка документа), указывающей версию XML. За ней следует XML-элемент с уникальным именем, который содержит в себе все остальные элементы и называется корневым. Директива (processing instruction) — это выражение, заключенное в специальные теги "<?" и "?>", которое содержит указания программе, обрабатывающей XML-документ.



Стандарт XML резервирует только одну директиву <?xml version="1.0"?>, указывающую на версию языка XML, которой соответствует данный документ (второй версии XML пока нет). В действительности, эта директива несколько богаче и в самом общем виде выглядит так:



<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>


Здесь атрибут encoding задает кодировку символов документа. По умолчанию считается, что XML-документы должны создаваться в формате UTF-8 или UTF-16. Если же используется какая-либо другая кодировка символов, то ее название должно быть указано в данном атрибуте, как показано в примере. Атрибут standalone говорит о том, содержит ли данный документ внешние разделы. Значение yes означает, что таких разделов нет, значение no — что они есть.



В общем случае, пролог может содержать также декларации типа документа.



3. Комментарии


XML-документы могут содержать комментарии, которые игнорируются приложением, обрабатывающим документ. Комментарии строятся по тем же правилам, что и в HTML:




  • начинайте комментарий с символов "<!--",


  • завершайте комментарий символами "-->",


  • не используйте внутри комментария символов "--".



Пример комментариев:



<!-- это комментарий -->


<!-- а вот еще комментарий,


     занимающий более одной строки -->


4. Имена и данные


Все имена элементов, атрибутов и разделов должны начинаться с буквы Unicode и состоять из букв, цифр, символов точки (.), подчеркивания (_) и дефиса (-). Единственное ограничение состоит в том, что они не должны начинаться с комбинации букв xml в любом регистре; подобные имена зарезервированы для будущих расширений языка. Существенно, что стандарт допускает использование в именах не только английских букв, но и любых других, хотя существующие XML-процессоры часто ограничены теми системами кодировок, которые в них заложены создателями. Поэтому мы в своих примерах пишем имена по-английски.



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



5. Специальные символы


Ряд символов в языке XML зарезервирован и должен представляться специальным образом:
































левая угловая скобка ("<")



&lt;



правая угловая скобка (">")



&gt;



амперсант ("&")



&amp;



двойная кавычка (") в значениях атрибутов



&quot;



одинарная кавычка (') в значениях атрибутов



&apos;





При желании можно пользоваться числовой кодировкой символов в стандарте Unicode. При этом символ может быть задан своим десятичным кодом (&#код;) или шестнадцатеричным кодом (&#xкод;). Например &#169; представляет символ авторского права ©, а &#x410; – русскую букву А. Как мы увидим в дальнейшем, XML гораздо богаче, чем HTML, в использовании подобных конструкций, поскольку позволяет осуществлять подстановку в текст документов любых символьных выражений.



6. Секции CDATA


Еще одним способом включения в содержимое XML-элементов недопустимых символов является использование т. н. секций CDATA (сокр. от Character DATA, т. е. символьные данные). Допустим, что мы хотим сделать содержимым элемента layout фрагмент HTML-текста, например:



<layout>


  <H1>Заголовок</H1>


</layout>


Подобная конструкция неверна, т. к. HTML-тег H1 будет в данном случае воспринят как тег XML. Для того, чтобы все содержимое элемента layout воспринималось как данные, мы должны заключить его в секцию CDATA:



<layout>


  <![CDATA[<H1>Заголовок</H1>]]>


</layout>


Как мы видим из этого примера, секция CDATA заключается в ограничители <![CDATA[ и ]]>. Все внутри этой секции считается символьными данными; в частности, секции CDATA не могут вкладываться друг в друга.



Разделы и их декларации



1. Разделы XML-документа


Физически XML-документ может состоять из несколько разделов (entities). При этом корневой элемент документа также является разделом, который называется разделом документа, хотя он никак специально не оформлен. Все разделы имеют содержимое; все они, кроме раздела документа и внешней DTD, имеют имя.



С точки зрения синтаксического разбора документа разделы подразделяются на анализируемые и неанализируемые. Неанализируемый раздел (unparsed entity) — это ресурс, содержимое которого XML-процессор воспринимает как внешние данные без их синтаксического анализа (например, текст, не являющийся XML-документом). Неанализируемые разделы всегда имеют нотацию, указывающую на их формат. Анализируемые разделы (parsed entities) предназначены для текстовой подстановки: всякий раз, когда XML-процессор встречает в документе имя такого раздела, он заменяет его на содержимое этого раздела.



2. Внутренние разделы


Декларации разделов подразделяются на внутренние и внешние. Декларация внутреннего раздела выглядит так:



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


Она включает в себя содержимое объекта (параметр значение) и используется для подстановки этого значения вместо имени раздела. Мы можем, например, ввести в пример с книгами атрибут жанр и использовать для задания жанра внутренние разделы:



<!DOCTYPE spec [


  <!ENTITY pr "проза">


  <!ENTITY po "поэзия">


]>


<books>


  <book genre="&po;">


    <title>Часть речи</title>


    <author>Бродский, Иосиф</author>


  </book>


  <book genre="&pr;">


    <title>Марш одиноких</title>


    <author>Довлатов, Сергей</author>


  </book>


</books>


Из этого примера видно, что ссылка на раздел (entity reference) выглядит точно так же, как ссылка на специальный символ, т. е. имеет вид &имя;. На самом деле, специальные символы — это точно такие же ссылки, но соответствующие разделы заданы неявно во внутренней декларации языка XML. Подобные текстовые подстановки удобны для задания сокращений, позволяющих уменьшить объем документа, и для введения обозначений для часто изменяемых полей документа. Так, например, мы можем вынести во внутренний раздел дату очередной ревизии публикации и затем изменять только значение этого раздела.



3. Внешние разделы


Существуют два варианта деклараций внешнего раздела:



<!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 …?>, которая может не содержать номера версии, но обязана содержать кодировку символов. Эта директива не входит в состав подставляемого текста.

Комментариев нет:

Отправить комментарий