eXtensible Markup Language 1

eXtensible Markup Language В моей статье "XML — потомок SGML" я попытался очень коротко описать, что такое XML и зачем он нужен. Я получил несколько писем, в которых читатели просят как можно подробнее остановиться на этой теме. Что я, собственно, и собираюсь сделать. Я постараюсь как можно подробнее рассказать о DTD, XML, XSLT, а также о спецификациях XPath, XLink, XPointer, XML Schema и о многом другом. Это повествование будет как можно более подробным и понятным читателю.

XML(Extensible Markup Language) — расширяемый язык разметки. Как я уже говорил, XML — это набор правил для описания новых языков разметки. Таких, как, например, XHTML. XML является подмоножеством SGML (Standart Generalized Markup Language). Последний был разработан сотрудниками IBM: Чарльзом Голдфарбом, Эдом Мошером, и Рэем Лори в далеком 1968 году. Цель его разработки — создать инструмент для разметки текстовой информации. В то время разрабатываемый язык назывался GML, а SGML — это уже результат стандартизации GML (по странному стечению обстоятельств буквы G, M и L являются первыми буквами фамилий его разработчиков). Когда дело касается языков разметки, очень часто употребляется термин "метаданные". Метаданными принято называть данные, описываемые другими данными. Например, любой непустой тег XHTML является метаданными, которые описывают то, что содержится внутри элемента XHTML, например: <title> Это заголовок </title> . В этом примере данные "Это заголовок" описываются метаданными <title> </title> . Можно рассмотреть и более простой пример. Возьмем библиотечные карточки на имеющиеся в библиотеке книги. В таблице 1 приведены метаданные и описываемые ими данные.

Данные: Метаданные:
Земля без радости. Название
Хроники Хьерварда
Ник Перумов Автор
2000 Год издания
ЭКСМО Издательство
HTML может служить непосредственным результатом описания языка разметки на SGML. HTML был разработан уже в 1989 году, как язык разметки для текстовых документов с использованием гиперссылок, Тимом Бернерс-Ли и Андресом Берглундом. Уже несколько позже был разработан протокол передачи гипертекста (HTTP, HyperText Transfer Protocal). После появления первого графического Web-браузера, World Wide Web стал стремительно развиваться, а вместе с ним и HTML. Однако стало понятно, что с помощью HTML невозможно решить очень много насущных задач. Вносить значительные изменения в HTML не представлялось возможным, т.к. он уже был широко распространен. Основными недостатками в HTML считается его неструктурированность: существование незакрывающихся тегов, регистронезависимость, спорные вопросы по поводу одинарных и двойных кавычек и много чего еще. Поэтому сообщество World Wide Web Consortium приняло решение о создании упрощенной версии SGML — XML.
Как я уже говорил в предыдущей статье о XML, XML не является заменой HTML. Это заблуждение. XML является наиболее подходящим языком для описания любых данных для Web и не только. Поэтому данные лучше всего структурировать с помощью XML-совместимого языка, а представлять — с помощью XSL или HTML.
Вот пример простого документа XML, описывающего несколько библиотечных карточек:

<?xml version = "1.0"?>
<LIBRARY>
<BOOK>
<NAME> Земля без радости. Хроники Хьерварда</NAME>
<AUTHOR> Ник Перумов</AUTHOR>
<YEAR> 2000</YEAR>
<PUBLISHER> ЭКСМО</PUBLISHER>
</BOOK>
<BOOK>
<NAME> А.П.Чехов Избранное</NAME>
<AUTHOR> В.И. Кулешова</AUTHOR>
<YEAR> 1982</YEAR>
<PUBLISHER> Юнацтва</PUBLISHER>
</BOOK>
</LIBRARY>
Как видно из этого примера, представление данных в XML выглядит очень доступно и просто. Разработчики, наблюдая скорость развития высоких технологий, сделали ставку не на экономию ресурсов, а на доступность и понятность конечному пользователю. В таком виде может быть представлена практически любая информация. Как уже было сказано по поводу повышенной строгости к структуре документа XML, в отличие от HTML XML имеет множество ограничений. Например, такие, как обязательное присутствие корневого элемента, наличие закрывающего элемента у непустых элементов (<img src = "my_image.jpg" /> ), регистрозависимость, т.е. <book> и </BOOK> не будут парой тегов, образующих один элемент, а также правила, описываемые в DTD или в XML Schema.
XML может использоваться где угодно. Он служит языком для описания огромного количество мета-языков во всех областях знаний по всему миру. С его помощью мы можем реализовать как язык для описания адресной книги, так и язык MathML. XML позволяет любому приложению представлять любую информацию в едином представлении и, впоследствии, она может быть без проблем использована в другом приложении. Это избавляет разработчиков от необходимости изобретения очередных форматов представления данных в своих программах. Использование XML упрощает поиск, осуществление транзакций между различными приложениями и базами данных. Это лишь малая часть того, что нам дает использование XML.

Структура документа XML
Из чего состоит XML? Важно знать, что в XML основным понятием является не тег, а элемент. Содержимое документа XML можно разделить на саму разметку (метаданные) и содержание (данные). Помимо элементов, при разметке XML используются атрибуты, комментарии, инструкции по обработке, ссылки на сущности и CDATA. Раздел CDATA не обрабатывается как весь остальной текст, а передается приложению, обрабатывающему XML-документ напрямую.
Обычный элемент состоит из открывающего и закрывающего тега. Если необходимо отсутствие закрывающего тега, то перед символом > ставится прямой слэш /, например, <PAGES count="255" /> .
Атрибуты XML практически ничем не отличаются от атрибутов в HTML. Только значение атрибута всегда должно быть заключено в двойные кавычки. Атрибуты помещаются после имени элемента.

<COVERIMAGE width = "250" height = "400"> image.jpg</COVERIMAGE>

Комментарии в XML ничем не отличаются от комментариев в HTML. Начало комментария обозначается символами <!-, а конец --> .

<!- Это пример комментария -->

Инструкции по обработке предназначены для передачи приложению, обрабатывающему XML-документ, некоторые инструкции или данные. Формат описания этих инструкций следующий:

<?приложение данные?>

Ссылки на сущности — это именованные константы. Сущности определяются в DTD. Позже мы рассмотрим формат их описания. Существуют также зарезервированные сущности. Они начинаются на &, например <. В отличие от HTML, в XML определено лишь несколько сущностей.
Как вы могли заметить, в приведенном примере XML-документа в самом начале идет инструкция по обработке следующего содержания:

<?xml version="1.0"?>

Это обязательный элемент, по которому мы можем судить о том, что это XML-документ. Как видно, в этой инструкции также определяется версия спецификации XML. Помимо версии мы можем указать кодировку. По умолчанию используется Unicode (перекодировка по UTF-8). Аналогичное представление о кодировке и у Java.
<?xml verstion = "1.0" encoding = "UTF-8">

После этой строчки может идти определение DTD:

<!DOCTYPE LIBRARY SYSTEM "library.dtd">

В этом примере подразумевается внешний DTD.

Document Type Definition
Поскольку XML-документ имеет строгую структурированность, то обязательно должны присутствовать средства, позволяющие проверять, не нарушена ли структура документа перед его обработкой. Именно для таких целей предназначен DTD. С его помощью определяются правила описания каждого элемента и его атрибутов, если такие имеются. Описанный DTD может быть применен к какому-либо XML-документу для контроля на соответствие правилам, описанным в этом DTD. Проверка XML-документа на валидность по DTD осуществляется внешними анализаторами. О них мы будет говорить несколько позже.
DTD может быть объявлено как непосредственно внутри XML-документа (внутренний DTD), так и во внешнем файле (внешний DTD). В случае внешнего DTD, в XML-документе определяется ссылка на него все в том же <!DOCTYPE.
Любое объявление DTD начинается с символов <!DOCTYPE. Далее следует название документа, которое, фактически, должно соответствовать корневому элементу XML-документа. После этого следует определение правил DTD, заключенных в квадратные скобки для внутренних DTD, или ключевое слово SYSTEM, или PUBLIC для внешнего определения типов. В случае с SYSTEM, вы описываете расположение внешнего файла DTD в формате (Uniform Resource Identificator, URI). После PUBLIC вам нужно будет указать уникальный идентификатор DTD. Вот как может выглядеть подключение внешнего и внутреннего DTD:

<!DOCTYPE LIBRARY SYSTEM "http://www. litvinuke.hut.ru/xml/library.dtd">
<!DOCTYPE LIBRARY
[
... здесь описываются правила DTD
]>

Всякое правило DTD сводится к определению типов содержимого того или иного элемента или атрибута.
Проще говоря, правила DTD определяют, что может содержаться в элементах и атрибутах. Объявление элемента в DTD имеет следующий формат:

<!ELEMENT имя_элемента тип_содержимого>

Существует четыре основных типа содержимого элемента:
EMPTY — означает, что элемент не имеет содержимого (пустой).
ANY — допускает любое содержимое элемента. Этот тип может нарушить структурированность XML-документа, т.к. в случае такого типа мы не можем четко проанализировать, что содержится в этом элементе. По этой причине он используется довольно редко.
Mixed — допускает содержание одновременно множества типов (как данные, так и вложенные элементы; смешанное).
Element — допускает в качестве содержимого только вложенные элементы.
Примеры использования вышеприведенных типов:
<!ELEMENT PAGES EMPTY>
Означает, что в XML-документе может содержаться элемент PAGES с пустым содержанием.
<!ELEMENT ANY_CONTENT ANY>
Элемент ANY_CONTENT может содержать любые данные, элементы.
<!ELEMENT LIBRARY (BOOK>
Элемент LIBRARY может содержать только один элемент BOOK. Дальше станет ясно, как определить возможность вхождения нескольких одинаковых элементов. Пока это правило не соответствует действительности, если его соотнести с примером нашего XML-документа библиотечных карточек.
<!ELEMENT BOOK (NAME, AUTHOR, YEAR, PUBLISHER>
Элемент BOOK содержит подэлементы NAME, AUTHOR, YEAR и PUBLISHER. Каждый в единственном экземпляре. Если нам необходимо указать, что содержимым является только один из этого списка, то вместо запятой можно использовать условный оператор | (ИЛИ):
<!ELEMENT BOOK (NAME | AUTHOR | YEAR | PUBLISHER>
Итак, для того, чтобы позволить вхождение нескольких одинаковых подэлементов используются специальные индикаторы: +, * и?.
+ — одно или более вхождений;
* — ноль и более вхождений;
? — ноль или одно вхождение.
Эти индикаторы ставятся после закрывающей круглой скобки. Например, чтобы правильно определить наш корневой элемент LIBRARY, нам необходимо указать следующее правило:
<!ELEMENT LIBRARY (BOOK)+>
Для определения элементов, которые содержат какие-либо данные, либо элементы смешанного типа, существует выражение #PCDATA. Оно определяет любую текстовую информацию, которая будет содержаться в элементе. Например:
<!ELEMENT NAME (#PCDATA>
Определяет элемент NAME и указывает, что в качестве содержимого этого элемента могут быть какие-либо данные, но не подэлементы.
Формат описания атрибутов в DTD мало чем отличается от описания элементов. Формат описания следующий:

<!ATTLIST имя_элемента
имя_атрибута1 тип_атрибута1 по_умолчанию1
имя_атрибута2 тип_атрибута2 по_умолчанию2>

Т.е. вы определяете одним выражением сразу все атрибуты указанного элемента. В качестве типа атрибута могут выступать строки, маркированный тип и перечисляемый. Строковый определяется ключевым словом CDATA, а перечисляемый задает возможные значения атрибута в круглых скобках через запятую.
"по_умолчанию" может принимать четыре значения:
#REQUIRED — указывает на обязательное указание атрибута в элементе;
#IMPLIED — определение атрибута необязательно;
#FIXED — заранее определенное значение, которое не может быть изменено.
Четвертым вариантом значения поля "по_умолчанию" может быть явное указание значения атрибута по умолчанию, заключенное в двойные кавычки. Например:

<!ATTLIST COVERIMAGE
width CDATA #REQUIRED
height CDATA #REQUIRED
border (YES, NO) #IMPLIED
alt CDATA "комментарий">

Итак, давайте теперь целиком определим DTD для нашего XML-документа LIBRARY:

<!DOCTYPE LIBRARY
[
<!ELEMENT LIBRARY (BOOK)+>
<!ELEMENT BOOK (NAME, AUTHOR, YEAR, PUBLISHER>
<!ELEMENT NAME (#PCDATA>
<!ELEMENT AUTHOR (#PCDATA>
<!ELEMENT YEAR (#PCDATA>
<!ELEMENT PUBLISHER (#PCDATA>
<!ATTLIST PUBLISHER CITY CDATA #IMPLIED>
]>

Теперь, имея такую таблицу правил, анализатор XML без труда обнаружит брешь в структуре документа. Например, если в элементе BOOK будет содержаться несколько элементов NAME.
Теперь, после прочтения этой статьи, вы без труда сможете спроектировать какой-нибудь простой XML-документ и написать для него Document Type Defenition. XML дает нам совместимость любых приложений. Даже работающих под разными операционными системами. Это еще раз подчеркивает неизбежную популярность XML не только в World Wide Web, но и как отдельной технологии вообще. В следующей статье будут рассмотрены не затронутые в этой статье темы. С вопросами и предложениями — пишите.

Алексей Литвинюк (c), litvinuke@tut.by


Компьютерная газета. Статья была опубликована в номере 27 за 2002 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета