Уважаемые читатели!
К сожалению, мой любимый Кристофер Дейт временно ушел в подполье. В последних двух номерах Intelligent Enterprise его колонка отсутствует. Последняя публикация в Data Base Programming and Design датирована мартом 1999 г. Я не знаю, с чем это связано, но подозреваю, что это его реакция на поведение издательства Miller Freeman, резко сократившего объем статей, посвященных тематике баз данных. С одной стороны это печально, поскольку чтение Дейта затягивает (на самом деле, я уверен, что его статьи будут выходить в каком-либо издании по-прежнему; человек, привыкший писать, не может перестать это делать), но, с другой стороны, господин Дейт дает мне возможность познакомить Вас с другими авторами.
Я предлагаю Вашему вниманию пересказ статьи Дэвида Хея, в которой содержится краткое введение в основные идеи языка XML. Статья кажется мне очень полезной, поскольку
Я думаю, что наше решение разместить мой пересказ сразу в двух разделах citforum (базы данных и Internet) вполне разумно, поскольку статья может пригодиться специалистам и той, и другой областей.
Приятного чтения, Сергей Кузнецов
Intelligent Enterprise, August 03, 1999, Volume 2, Number 11
David Hay
davehay@essentialstrategies.com
www.essentialstrategies.com
(www.intelligententerprise.com/990308/online1.html)
Аббревиатура XML теперь распространена повсеместно. Она не означает "eXtra Medium Large" для размера майки. Скорее она имеет отношние к Web. Кое в чем помогает работать с метаданными. Но что это такое?
Расширяемый язык разметки (eXtensible Markup Language - XML) - это язык описания документов, во многом похожий на язык разметки гипертекста (HyperText Markup Language - HTML), повсеместно используемый для конструирования Web-страниц. Однако он является гораздо более универсальным, чем HTML, и глубоко влияет на наши представления о Web и на то, чего может достичь эта технология.
Книги, описывающие XML, тянут на пять фунтов или даже больше, что досадно, поскольку базовая структура и назначение языка не так уж сложны. В этой статье приводится краткое неформальное описание основных понятий XML.
HTML - это язык, используемый для создания Web-страниц и основанный на предопределенном наборе "тегов", показывающих читающему текст программному обеспечению ("браузеру"), как представлять содержимое страницы. Подобно HTML, XML представляет собой систему тегов, описывающих компоненты документа. В наиболее простой инкарнации можно представлять XML как развитый вариант HTML. В действительности это не так: XML и HTML являются подмножествами того, что называется стандартным обобщенным языком разметки (Standard Generalized Markup Language - SGML). SGML - это сложный теговый язык, который, как тактично намекает OMG (Object Management Group, www.omg.org), "по причине [своей] сложности и сложности требуемых инструментальных средств не получил широкого распространия" (XML Metadata Interchange (XMI) Proposal to the OMG OA&DFT RFP3: Stream-based Model Interchange Format).
Как уже отмечалось, HTML состоит из набора предопределенных "тегов", заставляющих браузер выполнять над документом определенные действия. Обычно эти теги описывают аспекты представления, такие как стили и размеры фонтов, размещение строк и т.д. Однако некоторые теги также идентифицируют ссылки на другие страницы, рисунки и графику. Идея состоит в том, что любой браузер в Internet знает, как интерпретировать эти теги и что с ними делать. Однако, поскольку эти теги прежде всего предназначены для представления данных, невозможно использовать их для описания структуры данных или описания содержимого документа каким-либо другим образом.
В отличие от этого, XML дает пользователям возможность определять теги, предоставляя огромные возможности для описания структуры и природы информации, представленной документом. Однако это означает, что стандартные браузеры не смогут ничего сделать с этими расширениями. Поэтому создание программного обеспечения для XML является гораздо более сложным делом.
Вот пример на XML, в котором описывается структура записи данных в документе:
<?XML version="1.0"?>
<!- *** Basket *** ->
<PRODUCT>
<product_id>98756</product_id>
<product_name>basket</product_name>
<unit_of_measure>each</unit_of-measure>
<specification>
<variable>color</variable>
<value>blue</value>
</specification>
<specification>
<variable>size</variable>
<value>large</value>
</specification>
<specification></specification>
<specification/>
</PRODUCT>
Отметим несколько интересных моментов.
Прежде всего, как и в HTML, каждый тег окружается угловыми скобками (<>), и за ним обычно следует текст. За текстом, в свою очередь, следует тег в форме </...>. Тег может не иметь содержания, и тогда за ним сразу следует концевой тег (как в <specification></specification>, или тег может сам заканчиваться прямым слешем (как в <specification/>). Однако, в отличие от HTML, концевой тег требуется всегда.
Во-вторых, заметим, что в данном случае за тегом продукта следует набор связанных тегов, описывающих характеристики (в данном случае столбцы) продукта. Тег <PRODUCT> определяется таким образом, что за ним должен следовать в точности один тег для <product_id> и один тег для <product_name>. Тег <unit_of_measure> является необязательным, хотя пример этого не показывает. Тег <specification> также является необязательным, но у него может существовать одно или большее число вхождений.
Все XML-документы должны начинаться с <?XML version="1.0"?> (или с указанием другой действующей версии). Комментарии задаются в форме
<!- ... ->. Заметим, что пара двойных дефисов должны быть часть содержимого. Также заметим, что, в отличие от HTML, XML позволяет использовать комментарий для окружения строк кода, которые желательно сделать недействующими.
Смысл тега определяется в том, что называется объявлением типа документа (document type declaration - DTD). Это тело кода, определяющее теги через набор элементов. DTD для предыдущего примера выглядит примерно так:
<!DOCTYPE product [
<!ELEMENT PRODUCT (product_id,
product_name, unit_of_measure?, specification*)>
<!ELEMENT product_id (#PCDATA)>
<!ELEMENT product_name (#PCDATA)>
<!ELEMENT unit_of-measure (#PCDATA)>
<!ELEMENT specification (variable, value>>
<!ELEMENT variable (#PCDATA)>
<!ELEMENT value (#PCDATA)>
]
DTD для XML-документа может быть либо частью документа, либо внешним файлом. Если это внешний файл, то все равно оператор DOCTYPE должен присутствовать в документе с аргументом SYSTEM -filename-, где -filename- является именем файлаЮ содержащего DTD. Например, если бы приведенное выше DTD содержалось во внешнем файле с именем xxx.dtd, то оператор DOCTYPE должен был бы иметь вид
<!DOCTYPE product SYSTEM xxx.dtd>
Такая же строка должна быть первой строкой файла xxx.dtd.
Определение элемента product включает список других элементов, в данном случае, product_id, product_name, unit_of_measure и specification. Знак после unit_of_measure означает, что может иметься или не иметься одно вхождение; это необязательный элемент. Знак "*" после specification означает, что элемент является необязательным, но допускается одно или большее число вхождений. Если после какого-то элемента списка присутствует знак "+", то это означает обязательность элемента, а также то, что допускатся более одного вхождения.
В свою очередь, каждый из элементов списка должен быть определен в одной из следующих строк. #PCDATA означает, что тег будет содержать тег, который может быть разобран браузером. Элемент specification уточняется через определения элементов variable и value.
В XML различаются символы верхнего и нижнего регистров. Все ключевые слова XML состоят из символов верхнего регистра. Символы в именах тегов должны набираться на том же регистре, что и в определении DTD. В предыдущем примере имена сущностей/таблиц состоят из символов верхнего регистра, а имена атрибутов/столбцов - из символов нижнего регистра. Можно было бы сделать и по-другому.
У тегов могут быть атрибуты. Например, вместо перечисления соответствующих тегов в определении <!ELEMENT specification (variable, value)> можно было бы добавить в DTD следующие строки:
<!ATTLIST specification variable CDATA #required>
<!ATTLIST specification value CDATA #required>
Эти строки создают variable и value как два атрибута specification, так что они не обязаны появляться в виде отдельных элементов. Тогда данные из нашего примера выглядели бы следующим образом:
<?XML version="1.0"?>
<!- *** Basket *** ->
<PRODUCT>
<product_id>98756</product_id>
<product_name>basket</product_name>
<unit_of_measure>each</unit_of-measure>
<specification variable="color", value="blue"
</specification>
<specification variable="size", value="large"
</specification>
<specification></specification>
<specification/>
</PRODUCT>
Заметим, что этот подход дает дополнительную возможность выбора проектировщику XML-документов. Каждый метод обладает своими преимуществами и недостатками.
С XML-документом связаны три уровня корректности:
Что все это означает? Ответ на этот вопрос неочевиден. Понятно, что XML позволяет разрабатывать Web-экраны, отображающие данные из базы данных более простым и более управляемым образом. Однако язык не содержит механизм для реальной выборки данных из базы данных и их отображения. При желании создать Web-страницы, содержащие данные из базы данных требуется написать или купить программное обеспечение для выборки этих данных и создания страниц. Предположительно, код будет включать некоторую комбинацию Java и SQL.
В добавок к этому, по определению стандартный браузер не может должным образом интерпретировать определенные пользователем теги. Эту проблему можно решать тремя способами:
По-видимому, первые два подхода будут основываться на программном обеспечении, написанном на Java или аналогичном языке, но стандартные средства для того, чтобы это сделать, пока недоступны. Третий подход уже применяется. Например, химики создали на основе XML Химический язык разметки (Chemical Markup Language); то же относится к математикам, астрономам и т.д., у которых имеются наборы определенных тегов для описания данных, присущих их областям.
Одной из особенностей XML, привлекающей внимание промышленности, является возможность описания структур данных и хранимых данных. Предыдущий пример показывает, что с использованием XML можно определить новые теги специально для описания эквивалента таблиц и столбцов (или сущностей и атрибутов) в структуре реляционной базы данных. Еще более существенно то, что теги для набора столбцов или атрибутов могут связываться с тегами для их родительской таблицы или сущности. Хотя теговая структура кажется хорошим механизмом для описания и понимания структуры базы данных, способ организации данных требует как никогда ранее строгой дисциплины. XML не запрещает иметь повторяющиеся группы, чудовищные структуры данных и т.д. При желании использовать XML для выражения структуры данных нужно проделать настолько хорошую работу, нсколько это позволяет используемый инструмент.
Следуя традиции химиков и астрономов OMG сформировала набор тегов, названный XML Metadata Interchange (XMI), с целью предоставления возможности описания в стандартных терминах структуры данных о данных ("метаданных"). Этот стандарт будет полезен для обмена метаданными между CASE-средствами и для описания "репозитория метаданных" в проектах хранилищ данных. Двигаясь в том же направлении, группа компаний (включающая, в частности, IBM и Oracle) находится в процессе определения Common Warehouse Metadata Interchange (CWMI), подмножества XMI для поддержки хранилищ данных.
Это означает, что имеются два подхода к описанию структуры базы данных на XML:
Однако заметим, что проблема определения репозитория метаданных или обмена метаданными между CASE-средствами не связана с использованием XML или какого-либо другого языка. Проблемой является структура и семантика базы данных. Важный вопрос состоит не в том, как будет представляться универсальный репозиторий метаданных. (Можно легко представить репозиторий в виде набора реляционных таблиц или диаграмм сущность/связь.) Вопросы состоят в том, что находится в репозитории и что это означает? Какие объекты являются существенными и должны быть описаны? Это гораздо более сложная тема, и она все еще находится в стадии обсуждения. Наличие нового языка не вносит существенный вклад в это обсуждение.
На самом деле при наличии понимания, что XML является хорошим средством для описания структуры базы данных, наиболее очевидным выводом является то, что испоьзование этого языка накладывает большую ответственность на администраторов данных по поводу корректности определения данных. XML не обеспечивает такую корректность; XML всего лишь регистрирует любой проект данных, поступающий от разработчика.
Как говорит Клайв Финкельштейн (Clive Finkelstein), появление XML повышает важность моделирования и проектирования данных: "После 15 лет безвестности люди, занимающиеся моделированием данных, могут в конце концов добиться мгновенного успеха".
Автор статьи приносит благодарность Клайву Финкельштейну, познакомившему его с XML и потратившему много времени на чтение и исправление этой статьи.