Рис. 1.1. Документ и соответствующее ему дерево элементов
Очень важно понять, что XML-документ логически организован в виде дерева. Дерево является довольно простой структурой для обработки, но при этом выразительная сложность его весьма велика. Древовидная структура является одной из наиболее подходящих абстракций для описания объектов и отношений в реальном мире — возможно именно древовидное устройство наряду с простотой использования обеспечили XML такой потрясающий успех.
Обратимся теперь к синтаксису элементов. EBNF-правило, определяющее элемент, выглядит следующим образом:
>[39] element ::= EmptyElemTag
> | STag content ETag
Пустому элементу соответствует нетерминал >EmptyElemTag
. Непустой элемент начинается открывающим тегом (нетерминал >STag
), включает некоторое содержимое (>content
) и заканчивается закрывающим тегом (>ETag
).
Открывающий тег состоит из имени (>Name
) и последовательности определений атрибутов (>Attribute
), которые разделены пробельными символами:
>[40] STag ::= '<' Name (S Attribute)* S? '>'
В ряде случаев атрибуты тега могут отсутствовать.
Перед закрывающей угловой скобкой тега могут также стоять пробельные символы, поэтому вполне корректной будет следующая запись:
><а
> href="http://www.xsltdev.ru"
>>
В закрывающем теге имени предшествует косая черта (">/
") и перед закрывающей угловой скобкой тоже могут стоять пробелы:
>[42] ETag ::= '' Name S? '>'
Имена в открывающем и закрывающем тегах должны совпадать.
Содержимое элемента может состоять из элементов (нетерминал >element
), сущностей (>Reference
), секций символьных данных (>CDSect
), инструкций по обработке (>PI
) и комментариев (>Comment
), перемешанных с символьными данными (>CharData
):
>[43] content ::= CharData?
> ((element
> | Reference
> | CDSect
> | PI
> | Comment) CharData?)*
Пустой элемент не имеет содержимого и задается продукцией >EmptyElemTag
в следующем виде:
>[44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
Тег пустого элемента выглядит точно так же, как и тег непустого элемента с той лишь разницей, что перед закрывающей угловой скобкой стоит символ косой черты (">/
"). В этом, кстати, одно из главных отличий синтаксиса языка XML от HTML. Например, вместо >
в XML следует писать >
.
Замечание
Для того чтобы привести синтаксис HTML в соответствие со стандартом XML, был создан язык XHTML. Этот язык полностью соответствует синтаксису XML, что делает возможным обработку XHTML-документов XML-средствами, но при этом набор тегов XHTML идентичен набору тегов языка HTML. К сожалению, далеко не все браузеры поддерживают XHTML. Чаще всего проблемы возникают именно с пустыми элементами (или одиночными тегами в терминах HTML): например, браузеры могут некорректно воспринимать запись вида