Вопрос 2. Элементы и атрибуты XML-документа
Элементы XML-документа
XML - файл состоит из текста и разметки. Текст размещается в элементе, который начинается и заканчивается тегами.
Элемент имеет имя (это тип элемента), заключённое в угловые скобки <>, которое определяет начальный и конечный тэг (дискриптор). Имена (типы элементов) чувствительны к регистру символа. Имя элемента может начинаться с буквы, знака подчёркивания (_) или двоеточия (:) и не могут начинаться с буквосочетания “xml”.
Конечный тэг (дискриптор) дополнительно имеет косую черту.
Элемент может содержать один тэг (дискриптор) с пробелом и замыкающей косой чертой в конце:
<author = "Леонтьев" />
Элемент, состоящий из одного тэга (дискриптора) называется пустым элементом, а из двух тэгов и содержащий в себе любые данные – непустым.
Угловая скобка в начале дискриптора (<) в языках разметки называется MDO (Markup Declaration Open – открытие декларации разметки), а в конце дискриптора (>) - называется MDC (Markup Declaration Close – закрытие декларации разметки).
Хорошо оформленный XML документ обязательно должен иметь корневой элемент (root element). Внутри корневого элемента кроме текста могут находиться вложенные элементы:
<tutorial>
<title>"Учебное пособие по XМL"</title>
<author>Леонтьев Алексей Георгиевич</author>
</tutorial>
В XML - файле должен присутствовать только один корневой элемент. В примере это <tutorial>.
Вложенные элементы называются дочерними элементами, а элементы, которые их окружают – родительскими элементами.
Такое требование возникло потому, что один документ XML можно вложить в другой. При этом корневой элемент вложенного документа станет просто одним из элементов документа, в который он вложен. Такое вложение не нарушит структуру документа.
Начинается XML-файл обычно с объявления, которое ещё называют пролог (prolog). Пролог состоит из двух частей.
Первая часть пролога включает декларацию XML (XML Declaration). Декларация заключена между символами <?...?>, содержит пометку xml и номер версии спецификации XML. Она может включатьуказания на кодировку символов в которой написан данный текст. В объявление можно поместить еще параметр standalone со значениями "yes" или "no". Значение "no" показывает, что документ использует определения элементов, сделанные в другом, внешнем, документе. По умолчанию принимается значение "yes". Итак, полное объявление XML может выглядеть следующим образом:
<?xml version="1.0" encoding="WINDOWS-1251" standalone="yes"?>
Вторая часть пролога — объявление типа документа, DTD (Document Type Declaration) — может занимать одну или несколько строк. В этой части объявляются теги, использованные в документе, или приводится ссылка на файл, в котором записаны такие объявления. Объявление типа документа начинается с символов <!DOCTYPE, а заканчивается угловой скобкой — знаком "больше" >. Его содержимое зависит от способа объявления тегов.
Все это вместе выглядит так:
<?xml version="1.0" encoding="WINDOWS-1251" standalone="yes"?>
<!DOCTYPE tutorial SYSTEM "filename.dtd">
В примере рассматривается первая версия XML и русская кодировка символов для операционных систем Windows. Для операционных систем UNIX русская кодировка – "KOI8-R". Можно использовать универсальную кодировку "UTF-8" для Unicode.
Правила описания элементов XML-файла tutorial находится в каталоге SYSTEM, а не в общем каталоге PUBLIC в файле filename.dtd.
В примере, в соответствии с правилами, имя XML документа tutorial совпадает с именем корневого элемента.
Атрибуты XML-документа
Атрибуты состоят из имени и значения, где значение берется в двойные кавычки ("). Атрибуты позволяют сохранять вместе с элементом дополнительные параметры. Атрибут (или несколько атрибутов) указывается внутри начального тега элемента. При добавлении нескольких атрибутов они разделяются пробелами:
<author name="Леонтьев" surname="Алексей">
Имена атрибутов могут содержать такие же символы, что и имена элементов, с теми же правилами исключения пробелов и начала имени с буквы.
Значение атрибутов может заключаться как в одинарные (апострафы), так и в двойные кавычки. Кроме того возможно также использование одних кавычек внутри других:
<myElement attribute='"value"'></myElement>
Если значение атрибута содержит в себе кавычки, то его нужно заключить в апострофы, если значение содержит апострофы, то его заключают в кавычки. Если же кавычки и апострофы уже использованы для ограничения значений атрибутов, то внутри значения кавычку можно заменить ссылкой на сущность ", а апостроф – ссылкой '. Вместо ссылок на сущности можно записать коды кавычки и апострофа– " и '. В шестнадцатеричной форме коды кавычки и апострофа выглядят так: &#х22;и &#х27;.
Во время обдумывания разметки документа и создания тегов всегда возникает вопрос о том, куда поместить ту или иную информацию: в содержимое элемента или в его атрибуты? Ответ неоднозначен, он зависит и от самой информации, и от целей ее разметки, а часто это просто дело вкуса.
Атрибуты удобны для описания простых значений. Практически у каждого гражданина России обязательно есть одно имя, одно отчество и одна фамилия. Их удобно записывать атрибутами. Но у гражданина России может быть несколько телефонов, поэтому их номера удобнее оформить как элементы <work-phone> и <home-phone>, вложенные в элемент <phone-list>, а не атрибуты открывающего тега <phone-list>. Заметьте, что элемент <name> с атрибутами пустой, у него нет содержимого, следовательно, не нужен закрывающий тег. Поэтому тег <name> с атрибутами завершается символами "/>". Пример XML-документа с атрибутами в открывающем теге:
<?xml version="1.0" encoding="Windows-1251"?>
<!DOCTYPE notebook SYSTEM "ntb.dtd">
<notebook>
<person>
<name first="Ивaн" sесоnd="Петрович" surname="Сидоров" />
<birthday>25.03.1977</birthday>
<address>
<street>Садовая, 23-15</street>
<city>Санкт-Петербург</city>
<zip>123456</zip>
</address>
<phone-list>
<work-phone>2654321</work-phone>
<work-phone>2654 023</work-phone>
<home-phone>34567 81</home-phone>
</phone-list>
</person>
<person>
<name first="Mapия" sесоnd ="Петровна" surname="Сидорова" />
<birthday>17.05.1969</birthday>
<address>
<street>Малиновская, 17</street>
<city>Пушкин</city>
<zip>234561</zip>
</address>
<phone-list>
<home-phone>2334455</home-phone>
</phone-list>
</person>
</notebook>
В этом примере первые две строки – пролог (декларации, определения).
Элемент <name first="Ивaн" sесоnd="Петрович" surname="Сидоров" />- пустой и содержит три атрибута.
Элемент <person> повторяется дважды и является родительским для элементов: <name />, <birthday>, <address>, <phone-list>. Некоторые из этих элементов в свою очередь являются родительскими.
Атрибуты открывающего тега удобны и для указания типа элемента. Например, мы не уточняем, в городе живет наш родственник, в поселке или в деревне. Можно ввести в открывающий тег <city> атрибут type, принимающий одно из значений город, поселок, деревня. Например:
<city type="город">Mocквa</city>
Как видите, значения атрибутов можно записывать не только латинскими, но и русскими буквами. Спецификация XML допускает для записи значений атрибутов и содержимого элементов практически все символы Unicode.