Базовые сведения о формате XML

Данная статья не претендует на полноту и грамотность изложения, а дает лишь самые общие и базовые сведения об устройстве формата XML, для тех кто не совсем понимает что это такое. XML (англ. eXtensible Markup Language — расширяемый язык разметки) — текстовый формат, предназначенный для хранения структурированных данных. Файлы XML (как правило файлы с расширение *.xml) должны удовлетворять двум критериям для корректной работы с ними различного рода ПО:

  • Все данные должны быть корректно описаны, это подразумевает отсутствие нарушений в синтаксисе разметки файла. Существует множество различного ПО и веб сервисов, осуществляющих проверку XML синтаксиса, так же есть множество рекомендаций по оформлению XML/
  • Структура файла и названия а также тип значений атрибутов должна соответствовать спецификации ПО работающего с этими файлами.

Что касается первого пункта, то тут рекомендуется использование XML редакторов с проверкой синтаксиса (например <oXygen/> XML Editor ), а так же прочтение хотя бы данной статьи. Что касается второго пункта, то все что требуется это соблюдение соответсвующих спецификаций на сайте.

Синтаксис XML

XML — это описанная в текстовом формате иерархическая структура, предназначенная для хранения любых данных. Визуально структура может быть представлена как дерево элементов. Элементы XML описываются тегами. Рассмотрим пример простого кулинарного рецепта, размеченного с помощью XML:

 1<?xml version="1.0" encoding="UTF-8"?>
 2<recipe name="хлеб" preptime="5" cooktime="180">
 3  <title>Простой хлеб</title>
 4  <ingredient amount="3" unit="стакан">Мука</ingredient>
 5  <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
 6  <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
 7  <ingredient amount="1" unit="чайная ложка">Соль</ingredient>
 8  <instructions>
 9   <step>Смешать все ингредиенты и тщательно замесить.</step>
10   <step>Закрыть тканью и оставить на один час в тёплом помещении.</step>
11   <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... -->
12   <step>Замесить ещё раз, положить на противень и поставить в духовку.</step>
13  </instructions>
14</recipe>

Объявление XML

Первая строка XML-документа называется объявление XML (англ. XML declaration) — это строка, указывающая версию XML. В версии 1.0 объявление XML может быть опущено, в версии 1.1 оно обязательно. Также здесь может быть указана кодировка символов и наличие внешних зависимостей.

1<?xml version="1.0" encoding="UTF-8"?>

Спецификация требует, чтобы процессоры XML обязательно поддерживали Юникод-кодировки UTF-8 и UTF-16 (UTF-32 не обязателен). Признаются допустимыми, поддерживаются и широко используются (но не обязательны) другие кодировки, основанные на стандарте ISO/IEC 8859, также допустимы другие кодировки, например, русские Windows-1251, KOI-8. Часто в тегах принципиально не используют не-латинские буквы, в этом случае UTF-8 является очень удобной кодировкой — объём, как правило, меньше, чем при UTF-16; декодирование может быть выполнено как для всего документа, так и для конкретных атрибутов и текстов; весь документ не содержит запрещённых символов при попытке разбора с неправильной кодировкой.

Корневой элемент

Важнейшее обязательное синтаксическое требование заключается в том, что документ имеет только один корневой элемент (англ. root element) (также иногда называемый элемент документа (англ. document element)). Это означает, что текст или другие данные всего документа должны быть расположены между единственным начальным корневым тегом и соответствующим ему конечным тегом.
Следующий простейший пример — правильно построенный документ XML:

1<?xml version="1.0"?>
2<book>Это книга: "Книжечка"</book>

Следующий пример не является корректным XML-документом, потому что имеет два корневых элемента:

1<?xml version="1.0"?>
2<!-- ВНИМАНИЕ! Некорректный XML! -->
3<thing>Сущность №1</thing>
4<thing>Сущность №2</thing>

Комментарий

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

1<!-- Это комментарий. -->

Теги внутри комментария обрабатываться не должны.

Теги и элементы

Остальная часть этого XML-документа состоит из вложенных элементов, некоторые из которых имеют атрибуты и содержимое. Элемент обычно состоит из открывающего и закрывающего тегов, обрамляющих текст и другие элементы. Открывающий тег состоит из имени элемента в угловых скобках, например, <step>, а закрывающий тег состоит из того же имени в угловых скобках, но перед именем ещё добавляется косая черта, например, </step>. Имена элементов, как и имена атрибутов, не могут содержать пробелы, но могут быть на любом языке, поддерживаемом кодировкой XML-документа. Имя может начинаться с буквы, подчёркивания, двоеточия. Остальными символами имени могут быть те же символы, а также цифры, дефис, точка.
Содержимым элемента (англ. content) называется всё, что расположено между открывающим и закрывающим тегами, включая текст и другие (вложенные) элементы. Ниже приведён пример XML-элемента, который содержит открывающий тег, закрывающий тег и содержимое элемента:

1<step>Содержимое элемента</step>

Следует отметить что как правило в роли содержимого элемента выступает один или несколько других элементов, например:

1<grpoup>
2  <node>Глава 1</node>
3  <node>Глава 2</node>
4  <grpoup>
5    <node>Глава 3 Часть 1я</node>
6    <node>Глава 3 Часть 2я</node>
7  </grpoup>
8</grpoup>

Часто элементы не имеют содержимого, в этом случае закрывающий тэг может быть совмещен с открывающим, в таком случае косая черта ставится в конце тега, например, <step />. Пустые элементы часто применяются в этом случае смысловую нагрузку несет не содержимое элемента а его атрибуты (об этом ниже). В качестве еще одного примера, приведем эквивалентные записи 3 пустых элементов:

1<node>
2</node>
3
4<node></node>
5
6<node />

Атрибуты элемента

Кроме содержания у элемента могут быть атрибуты — пары имя-значение, добавляемые в открывающий тег после названия элемента. Значения атрибутов всегда заключаются в кавычки (одинарные или двойные), одно и то же имя атрибута не может встречаться дважды в одном элементе. Не рекомендуется использовать разные типы кавычек для значений атрибутов одного тега.

1<ingredient amount="3" unit="стакан">Мука</ingredient>

В приведённом примере у элемента «ingredient» есть два атрибута: «amount», имеющий значение «3», и «unit», имеющий значение «стакан». С точки зрения XML-разметки, приведённые атрибуты не несут никакого смысла, а являются просто набором символов.
Кроме текста, элемент может содержать другие элементы:

1<Food Name="Хлеб">
2  <ingredient amount="3" unit="стакан">Мука</ingredient>
3  <ingredient amount="1" unit="стакан">Вода</ingredient>
4  <ingredient amount="0.5" unit="чайная ложка">Соль</ingredient>
5</Food>

В данном случае элемент «Food » содержит три элемента «ingredient ».
XML не допускает перекрывающихся элементов. Например, приведённый ниже фрагмент некорректен, так как элементы «em» и «strong» перекрываются.

1<!-- ВНИМАНИЕ! Некорректный XML! -->
2<p>Обычный <em>акцентированный <strong>выделенный и акцентированный</em> выделенный</strong></p>

Заключение

В дальнейшем для упрощения будем под словом "Тэг" подразумевать элемент с указанным именем, например под тэгом Group c атрибутами Name, равным "Пример" и Id равным 13 подразумевается элемент <Group Id="13" Name="Куча" />