Язык XML - практическое введение

Просмотр XML - документов

Как уже отмечалось, в отличии от HTML, XML никак не определяет способ отображения и использования описываемых с его помощью элементов документа, т.е. программе-анализатору предоставляется возможность самой выбирать нужное оформление. Этого требует принцип независимости определения внутренней структуры документа от способов представления этой информации. Например, задавая в документе элемент роза, мы лишь указываем, что rose в данном случае является цветком, но информации о том, как должен выглядеть данный элемент документа на экране клиента и должен ли он отображаться вообще, в таком определении нет.
Для того, чтобы использовать данные, определяемые элементами XML, например, отображать их на экране пользователя, необходимо написать программу-анализатор, которая бы выполняла эти действия. Уже сегодня таких программ появилось достаточное количество и у разработчиков существует возможность выбора наиболее подходящей из них для решения конкретных проблем
Как уже отмечалось ранее, в общем случае, программы- анализаторы можно разделить на две группы: верифицирующие(т.е. использующие DTD- описания для определения корректности документа) и не верифицирующие. Если Вы создаете свой язык и описываете его грамматику на основе DTD, то для анализа документов, написанных на этом языке, безусловно, потребуется программа, проверяющая корректность составления документа. Но так как использование DTD в XML не является обязательным, то любой правильно оформленный документ может быть распознан и разобран программой, предназначенной для анализа XML- документов. В любом случае, используя универсальные XML- анализаторы, Вы можете быть уверенным в том, что если заданные в документе конструкции языка являются синтаксически правильными, то программа-анализатор сможет правильно извлечь определяемые ими элементы документа и передать их прикладной программе, выполняющей необходимые действия по отображению. Т.е. после разбора документа в большинстве случаев, Вам предоставляется объектная модель, отображающая содержимое Вашего документа, и средства, необходимые для работы с ней (прохода по дереву элементов). При этом в некоторых анализаторах способ представления структуры документа основывается на спецификации DOM, описанной в[4]. Поэтому у Вас появляется также возможность использовать строгую иерархическую модель DOM для построения собственных документов.
Если речь идет о способах отображения информации, хранящейся в XML, то необходимо упомянуть разрабатываемый в настоящее время W3C стандарт стилевых таблиц для XML, которые предназначены для описания правил отображения элементов XML. Более подробно мы поговорим об XSL чуть позже.

Стилевые таблицы XSL

В предыдущем разделе для вывода элементов XML- документа на экран броузера мы применяли Java Script-сценарии Однако, как уже отмечалось, для этих целей предпочтительней использование специально предназначенного для этого средства - стилевых таблиц XSL(Extensible Stylesheet Language).
Стилевыми таблицами (стилевыми листами) принято называть специальные инструкции, управляющие процессом отображения элемента в окне программы-клиента(например, в окне броузера). Предложенные в качестве рекомендация W3C, каскадные стилевые таблицы(CSS- Cascading Style Sheets [7]) уже больше года используются Web- разработчиками для оформления Web- страниц. Поддержка CSS наиболее известными на сегодняшний день броузерами Netscape Navigator(начиная с версии 4.0) и Microsoft Explorer(начиная с версии 3.0), позволила использовать стилевые таблицы для решения самого широкого спектра задач - от оформления домашней странички до создания крупного корпоративного Web-узла. Слово каскадные в определении CSS означает возможность объединения отдельных элементов форматирования путем вложенных описаний стиля. Например, атрибуты текста, заданные в тэге , будут распространяться на вложенные тэги до тех пор, пока в них не встретятся стилевые описания, отменяющие или дополняющие текущие параметры. Таким образом, использование таблиц CSS в HTML было весьма эффективно - отпадала необходимость явного задания тэгов форматирования для каждого из элементов документа.
Являясь очень мощным средством оформления HTML- страниц, CSS- таблицы, тем не менее, не могут применяться в XML-документах, т.к. набор тэгов в этом языке не ограничен и использование статических ссылок на форматируемые объекты документа в этом случае невозможно.
Поэтому для форматирования XML- элементов был разработан новый язык разметки, являющийся подмножеством XML, и специально был предназначен для форматирования XML- элементов.
Некоторые его отличия от CSS:

Во-первых, стилевые таблицы XSL позволяют определять оформление элемента в зависимости от его месторасположения внутри документа, т.е. к двум элементам с одинаковым названием могут применяться различные правила форматирования.


Во-вторых, языком, лежащем в основе XSL, является XML, а это означает, что XSL более гибок, универсален и у разработчиков появляется возможность использования средства для контроля за корректностью составления таких стилевых списков(используя DTD или схемы данных)

В-третьих, таблицы XSL не являются каскадными, подобно CSS, т.к. чрезвычайно сложно обеспечить "каскадируемость" стилевых описаний, или, другими словами, возможность объединения отдельных элементов форматирования путем вложенных описаний стиля, в ситуации, когда структура выходного документа заранее неизвестна и он создается в процессе самого разбора. Однако в XSL существует возможность задавать правила для стилей, при помощи которых можно изменять свойства стилевого оформления, что позволяет использовать довольно сложные приемы форматирования

В настоящий момент язык XSL находится на стадии разработки в W3C[3] и в будущем, видимо, станет частью стандарта XML. Это означает, что использование этого механизма является наиболее перспективным способом оформления XML- документов. В текущем рабочем варианте W3C, XSL рассматривается не только как язык разметки, определяющий стилевые таблицы - в него заложены средства, необходимые для выполнения действий по фильтрации информации, выводимой в окно клиента, поиска элементов, сложного поиска, основанного на зависимостях между элементами и т.д. На сегодняшний день единственным броузером, поддерживающим некоторые из этих возможностей, является бэта-версия Internet Explorer 5.0, однако в самом ближайшем будущем, безусловно, XSL будет использоваться также широко, как сегодня стандартные тэги HTML
В этом разделе мы рассмотрим упрощенную объектную модель XSL- документа, используемую в текущей версии XSL-конвертора Microsoft msxsl, и поэтому информацию, изложенную далее, нельзя считать описанием стандарта языка. Полный рабочий вариант спецификации XSL в последней его редакции доступен на сервере [3].
Все примеры, приводимые далее, могут быть проверены при помощи XSL- конвертора, свободно доступного на странице Mcrosoft [ www.microsoft.com/xml/xsl/ ]

Documents Type Definitions (DTD)

В XML- документах DTD определяет набор действительных элементов, идентифицирует элементы, которые могут находиться в других элементах, и определяет действительные атрибуты для каждого из них. Синтаксис DTD весьма своеобразен и от автора-разработчика требуются дополнительные усилия при создании таких документов(сложность DTD является одной из причин того, что использование SGML, требующего определение DTD для любого документа, не получило столь широкого распространения как, например, HTML). Как уже отмечалось, в XML использовать DTD не обязательно - документы, созданные без этих правил, будут правильно обрабатываться программой-анализатором, если они удовлетворяют основным требованиям синтаксиса XML. Однако контроль за типами элементов и корректностью отношений между ними в этом случае будет полностью возлагаться на автора документа. До тех пор, пока грамматика нашего нового языка не описана, его сможем использовать только мы, и для этого мы будем вынуждены применять специально разработанное программное обеспечение, а не универсальные программы-анализаторы..
В DTD для XML используются следующие типы правил: правила для элементов и их атрибутов, описания категорий(макроопределений), описание форматов бинарных данных. Все они описывают основные конструкции языка - элементы, атрибуты, символьные константы внешние файлы бинарных данных.
Для того, чтобы использовать DTD в нашем документе, мы можем или описать его во внешнем файле и при описании DTD просто указать ссылку на этот файл или же непосредственно внутри самого документа выделить область, в которой определить нужные правила. В первом случае в документе указывается имя файла, содержащего DTD- описания:
...
Внутри же документа DTD- декларации включаются следующим образом:
... ... ]> ...
В том случае, если используются одновременно внутренние и внешние описания, то программой-анализатором будут сначала рассматриваться внутренние, т.е. их приоритет выше. При проверке документа XML- процессор в первую очередь ищет DTD внутри документа. Если правила внутри документа не определены и не задан атрибут standalone ="yes" , то программа загрузит указанный внешний файл и правила, находящиеся в нем, будут считаны оттуда. Если же атрибут standalone имеет значение "yes", то использование внешних DTD описаний будет запрещено.

Схемы данных

Схемы данных (Schemas) являются альтернативным способом создания правил построения XML-документов. По сравнению с DTD, схемы обладают более мощными средствами для определения сложных структур данных, обеспечивают более понятный способ описания грамматики языка, способны легко модернизироваться и расширяться. Безусловным достоинством схем является также то, что они позволяют описывать правила для XML- документа средствами самого же XML.
Однако это не означает, что схемы могут полностью заменить DTD- описания - этот способ определения грамматики языка используется сейчас практическими всеми верифицирующими анализаторами XML и, более того, сами схемы, как обычные XML- элементы, тоже описываются DTD. Но серьезные возможности нового языка и его относительная простота, безусловно, дают основания утверждать, что будущий стандарт найдет широкое применение в качестве удобного и эффективного средства проверки корректности составления документов.
В настоящее время в W3 консорциуме идет работа над первой спецификацией схем данных, рабочий ее вариант сейчас доступен на сервере [36]. В этом разделе мы рассмотрим основные возможности схем данных, попытаемся использовать их для проверки корректности ранее описываемых XML- документов.

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

Для того, чтобы в описании элемента определить его атрибуты и описать свойства этих атрибутов мы должны использовать элемент attribute:

В данном примере элементу определяется атрибут src, значением которого может быть любая последовательность разрешенных символов:

Подобно DTD, схемы данных позволяют устанавливать ограничения на значения и способ использования атрибутов. Для этого в дескрипторе необходимо использовать параметр atttype.
Например, если мы хотим указать, что значение атрибута должно использоваться программой-анализатором как уникальный идентификатор, то нам необходимо создать следующее правило:

Если же требуется задать список возможных значений атрибута, то пример будет выглядеть следующим образом:

Для приведенных примеров корректным будет являться следующий фрагмент XML-документа:
rose leaf bluet

Атрибуты

Если при определении элементов необходимо задать какие-либо параметры, уточняющие его характеристики, то имеется возможность использовать атрибуты эдлемента. Атрибут - это пара "название" = "значение", которую надо задавать при определении элемента в начальном тэге. Пример:
RGB="true">#ff08ff RGB="false">white
или
Ivan Petrov
Примером использования атрибутов в HTML является описание элемента :
Black

CDATA

Чтобы задать область документа, которую при разборе анализатор будет рассматривать как простой текст, игнорируя любые инструкции и специальные символы, но, в отличии от комментариев, иметь возможность использовать их в приложении, необходимо использовать тэги . Внутри этого блока можно помещать любую информацию, которая может понадобится программе- клиенту для выполнения каких-либо действий (в область CDATA, можно помещать, например, инструкции JavaScript). Естественно, надо следить за тем, чтобы в области, ограниченной этими тэгами не было последовательности символов ]].

Что дальше

Мы рассмотрели в общих чертах основные структурные части XML- документа, правила описания элементов XML и теперь можем создать синтаксически правильный XML- документ, содержащий каким-то образом структурированные данные( более подробный пример приведен в Приложении 1.) Однако при этом почти не коснулись вопросов практического применения XML. Как отображать содержимое XML- документов на Web- страницах, осуществлять контроль над правильностью их составления; существуют ли уже сегодня какие-либо удобные средства для создания, анализа и просмотра таких документов? В следующих разделах мы попробуем ответить на эти вопросы.
Содержание | Вперед

Cпециальные символы

Для того, чтобы включить в документ символ, используемый для определения каких-либо конструкций языка (например, символ угловой скобки) и не вызвать при этом ошибок в процессе разбора такого документа, нужно использовать его специальный символьный либо числовой идентификатор. Например, < , > " или $(десятичная форма записи), &#x1a (шестнадцатеричная) и т.д. Строковые обозначения спецсиволов могут определяться в XML документе при помощи компонентов (entity), о чем мы еще поговорим немного позже.

Директивы анализатора

Инструкции, предназначенные для анализаторов языка, описываются в XML документе при помощи специальных тэгов - ) или создании пространства имен[11].

Для чего нужен новый язык разметки?

Когда осенью 1991 года Интернет впервые услышал позывные новой технологии, название которой легко уместилось в три буквы, почти никто не мог представить себе, что завоевания ее окажутся настолько глобальными. Сегодня для многих неискушенных пользователей слово Интернет прочно ассоциируется с WWW и с уст специалистов не сходит тема будущего информационных систем и влияния на это будущее всемирной сетевой паутины.
Популярность World Wide Web и неотъемлемой ее части, HTML, безусловно, стала причиной повышенного внимания к системам гипертекстовой разметки документов. Хотя понятие гипертекста было введено В.Бушем еще в 1945 году и, начиная с 60-х годов стали появляться первые приложения, использующие гипертекстовые данные, всплеск активности вокруг этой технологии начался лишь тогда, когда возникла реальная необходимость в механизме объединения множества информационных ресурсов, обеспечения возможности создания, просмотра нелинейного текста. И примером реализации этого механизма послужила паутина WWW.
Язык разметки документов - это набор специальных инструкций, называемых тэгами, предназначенных для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Тэги языка, или, как их иногда называют, управляющие дескрипторы, в таких документах каким-то образом кодируются, выделяются относительно основного содержимого документа и служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента. В самых первых системах для обозначения этих команд использовались символы “<” и “>”, внутри которых помещались названия инструкций и их параметры. Сейчас такой способ обозначения тэгов является стандартным.
Использование гипертекстовой разбивки текстового документа в современных информационных системах во многом связано с тем, что гипертекст позволяет создавать механизм нелинейного просмотра информации. В таких системах данные представляются не в виде непрерывного потока текстовой информации, а набором взаимосвязанных компонентов, переход по которым осуществляется при помощи гиперссылок.

Самый популярный на сегодняшний день язык гипертекстовой разметки – HTML, был создан специально для организации информации, распределенной в сети Интернет, и является одной из ключевых составляющих технологии WWW. С использованием гипертекстовой модели документа способ представления разнообразных информационных ресурсов в сети стал более упорядочен, а пользователи получили удобный механизм поиска и просмотра нужной информации.

HTML [8]является упрощенной версией стандартного общего языка разметки - SGML (Standart Generalised Markup Language[10]), который был утвержден ISO в качестве стандарта еще в 80-х годах. Этот язык предназначен для создания других языков разметки, он определяет допустимый набор тэгов, их атрибуты и внутреннюю структуру документа. Контроль за правильностью использования дескрипторов осуществляется при помощи специального набора правил, называемых DTD- описаниями(более подробно о DTD мы поговорим чуть позже), которые используются программой клиента при разборе документа. Для каждого класса документов определяется свой набор правил, описывающих грамматику соответствующего языка разметки. С помощью SGML можно описывать структурированные данные, организовывать информацию, содержащуюся в документах, представлять эту информацию в некотором стандартизованном формате. Но в виду некоторой своей сложности, SGML использовался, в основном, для описания синтаксиса других языков(наиболее известным из которых является HTML), и немногие приложения работали с SGML- документами напрямую.

Гораздо более простой и удобный, чем SGML, язык HTML позволяет определять оформление элементов документа и имеет некий ограниченный набор инструкций - тэгов, при помощи которых осуществляется процесс разметки. Инструкции HTML, в первую очередь, предназначены для управления процессом вывода содержимого документа на экране программы-клиента и определяют этим самым способ представления документа, но не его структуру. В качестве элемента гипертекстовой базы данных, описываемой HTML, используется текстовый файл, который может легко передаваться по сети с использованием протокола HTTP. Эта особенность, а также то, что HTML является открытым стандартом и огромное количество пользователей имеет возможность применять возможности этого языка для оформления своих документов, безусловно, повлияли на рост популярности HTML и сделали его сегодня главным механизмом представления информации в Web


Однако современные приложения нуждаются не только в языке представления данных на экране клиента, но и в механизме, позволяющем определять структуру документа, описывать содержащиеся в нем элементы. HTML обладает несложным набором команд и вполне успешно справляется с задачей описания текстовой информации и отображением ее на экране программы просмотра- броузера. Однако сами отображаемые данные никак не связаны с теми тэгами, которые используются для форматирования, поэтому у программ-анализаторов нет возможности использовать тэги HTML для поиска нужных нам фрагментов документа. Т.е. встретив, например, такое описание

rose,

программа просмотра будет знать, каким цветом отобразить текст, содержащийся внутри тэгов и, вероятно, отобразит его правильно, но ей абсолютно безразлично, в каком месте документа встретился этот тэг, в какие другие тэги заключен текущий фрагмент, существуют ли вложенные в него фрагменты, правильно ли построены отношения между объектами. Такое "безразличие" к структуре документа приводит к тому, что поиск или анализ информации внутри него ничем не будет отличаться от работы со сплошным, не разбитым на элементы текстовым файлом. А это, как известно, не самый эффективный способ работы с информацией.

Другим существенным недостатком HTML можно назвать ограниченность набора его тэгов. DTD- правила для HTML определяют фиксированный набор дескрипторов и поэтому у разработчика нет возможности вводить собственные, специальные тэги. Хотя время от времени появляются новые расширения языка(на сегодняшний день последней версией HTML является HTML 4.0), но долгий путь их стандартизации, сопровождаемый постоянными разногласиями между основными производителями броузеров делают практически невозможной быструю адаптацию языка, его использование для отображения специализированной информации(например, мультимедийной, математических, химических формул и т.д.).

Подводя итог всему сказанному, можно утверждать, что HTML уже сегодня не удовлетворяет в полной мере требованиям, предъявляемым современными разработчиками к языкам подобного рода. И ему на смену был предложен новый язык гипертекстовой разметки, мощный, гибкий, и, одновременно с этим, удобный язык XML. В чем же заключается его достоинства?


XML (Extensible Markup Language[1]) - это язык разметки, описывающий целый класс объектов данных, называемых XML- документами. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов. Т.е. сам по себе XML не содержит никаких тэгов, предназначенных для разметки, он просто определяет порядок их создания. Таким образом, если, например, мы считаем, что для обозначения элемента rose в документе необходимо использовать тэг
rose

Набор тэгов может быть легко расширен. Если, предположим, мы хотим также указать, что описание цветка должно по смыслу идти внутри описания оранжереи, в которой он цветет, то просто задаем новые тэги и выбираем порядок их следования:

rose

Если мы хотим посадить туда еще несколько цветочков, то должны внести следующие изменения:

rose tulip cactus

Как видно, сам процесс создания XML документа очень прост и требует от нас лишь базовых знаний HTML и понимания тех задач, которые мы хотим выполнить, используя XML в качестве языка разметки. Таким образом, у разработчиков появляется уникальная возможность определять собственные команды, позволяющие им наиболее эффективно определять данные, содержащиеся в документе. Автор документа создает его структуру, строит необходимые связи между элементами, используя те команды, которые удовлетворяют его требованиям и добивается такого типа разметки, которое необходимо ему для выполнения операций просмотра, поиска, анализа документа.

Еще одним из очевидных достоинств XML является возможность использования его в качестве универсального языка запросов к хранилищам информации. Сегодня в глубинах W3C находится на рассмотрении рабочий вариант стандарта XML-QL(или XQL), который, возможно, в будущем составит серьезную конкуренцию SQL. Кроме того, XML-документы могут выступать в качестве уникального способа хранения данных, который включает в себя одновременно средства для разбора информации и представления ее на стороне клиента. В этой области одним из перспективных направлений является интеграция Java и XML - технологий, позволяющая использовать мощь обеих технологий при построении машинно-независимых приложений, использующих, кроме того, универсальный формат данных при обмене информации.


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

Также одним из достоинств XML является то, что программы-обработчики XML- документов не сложны и уже сегодня появились и свободно распространяются всевозможные программные продукты, предназначенные для работы с XML-документами. XML поддерживается сегодня в Microsoft Internet Explorer 4/0 и в бэта-версиях IE5. Было заявлено о его поддержке в последующих версиях Netscape Communicator, СУБД Oracle, DB-2, в приложениях MS-Office . Все это дает основания предполагать, что, скорее всего, в ближайшем будущем XML станет основным языком обмена информации для информационных систем, заменив собой, тем самым, HTML. На основе XML уже сегодня созданы такие известные специализированные языки разметки, как SMIL, CDF, MathML, XSL, и список рабочих проектов новых языков, находящихся на рассмотрении W3C, постоянно пополняется.

Documents Type Definitions (DTD)

В XML- документах DTD определяет набор действительных элементов, идентифицирует элементы, которые могут находиться в других элементах, и определяет действительные атрибуты для каждого из них. Синтаксис DTD весьма своеобразен и от автора-разработчика требуются дополнительные усилия при создании таких документов(сложность DTD является одной из причин того, что использование SGML, требующего определение DTD для любого документа, не получило столь широкого распространения как, например, HTML). Как уже отмечалось, в XML использовать DTD не обязательно - документы, созданные без этих правил, будут правильно обрабатываться программой-анализатором, если они удовлетворяют основным требованиям синтаксиса XML. Однако контроль за типами элементов и корректностью отношений между ними в этом случае будет полностью возлагаться на автора документа. До тех пор, пока грамматика нашего нового языка не описана, его сможем использовать только мы, и для этого мы будем вынуждены применять специально разработанное программное обеспечение, а не универсальные программы-анализаторы..
В DTD для XML используются следующие типы правил: правила для элементов и их атрибутов, описания категорий(макроопределений), описание форматов бинарных данных. Все они описывают основные конструкции языка - элементы, атрибуты, символьные константы внешние файлы бинарных данных.
Для того, чтобы использовать DTD в нашем документе, мы можем или описать его во внешнем файле и при описании DTD просто указать ссылку на этот файл или же непосредственно внутри самого документа выделить область, в которой определить нужные правила. В первом случае в документе указывается имя файла, содержащего DTD- описания:
...
Внутри же документа DTD- декларации включаются следующим образом:
... ... ]> ...
В том случае, если используются одновременно внутренние и внешние описания, то программой-анализатором будут сначала рассматриваться внутренние, т.е. их приоритет выше. При проверке документа XML- процессор в первую очередь ищет DTD внутри документа. Если правила внутри документа не определены и не задан атрибут standalone ="yes" , то программа загрузит указанный внешний файл и правила, находящиеся в нем, будут считаны оттуда. Если же атрибут standalone имеет значение "yes", то использование внешних DTD описаний будет запрещено.

element contents ANYgt;



Еще один способ исправлений

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

FAQ

  • Frequently Asked Questions about the Extensible Markup Language(The XML FAQ ) - http://www.ucc.ie/xml/

  • Extensible Markup Language Frequently Asked Questions( XML FAQ) - http://www.textuality.com/xml/faq.html

  • "20 Questions About XML." By Trisha Gorman. - http://builder.cnet.com/Authoring/Xml20/index.html


  • Фильтрация элементов

    Одним из самых мощных средств XSL является возможность сортировки и выборки элементов, выделяемых из общего дерева элементов документа. Для этого используется элемент ;, который заменяет в правилах, определяя те элементы, которые следует обработать в процессе рекурсивного обхода. Например, в следующем примере будут обработаны только элементы :

    Элемент сам по себе не определяет шаблон форматирования, он лишь управляет работой анализатора, обозначая, подобно , "нижележащие" элементы. В приведенном примере элемент должен быть расположен внутри элемента
    Для того, чтобы в шаблоне выделить не только собственные дочерние элементы, но и дочерние элементы потомков, т.е. использовать несколько уровней вложенности, необходимо задать параметр from = "descendants". Если параметр имеет значение "children", что указывает на то, что выбор должен производится из списка собственных дочерних элементов, то атрибут from может опускаться, т.к. "children" является значением по умолчанию.

    Группировка элементов

    Элемент group используется для того, чтобы задать некоторую последовательность вложенных объектов:

    Группировка объектов позволяет определять сразу группу объектов различных типов, которые могут находится внутри данного объекта. В приведенном примере мы указали, что внутри объекта типа contacts могут быть включены элементы tel, email, и url, причем атрибутом occurs мы указали, что элементы в группе являются необязательными. Корректным для таких схем будут являться следующие фрагменты документов:
    12-12-12 info@j.com http://www.j.com ... 12-12-12 ... 12-12-12 info@j.com
    При помощи атрибута groupOrder можно также задавать режим использования группированных элементов При установленном значении OR возможно использование не всех элементов группы, а лишь некоторых из них. Если задано значение AND, то оба элемента должны быть включены в обязательном порядке. Например, для следующей группы правил:

    будут считаться правильными только следующие варианты:
    12-12-12 info@j.com http://www.j.com
    или
    12-12-12

    Иерархия классов

    Для того, чтобы при описании класса ограничить список объектов, которые могут являться родительскими для данного элемента, необходимо использовать элемент схемы domain.
    Инструкция указывает, что текущий объект должен определяться строго внутри элемента, заданного этим тэгом. Например, в следующем фрагменте указывается, что элемент может быть определен строго внутри тэга
    :


    Информация по некоторым языкам разметки, производным от XML

  • Meta Content Framework Using XML - http://www.textuality.com/mcf/NOTE-MCF-XML.html;

  • Resource Description Framework (RDF) - http://www.w3.org/RDF/

  • Synchronized Multimedia Integration Language (SMIL) - http://www.w3.org/AudioVideo/

  • Mathematical Markup Language (MathML) - http://www.w3.org/Math/

  • CML - Chemical Markup Language - http://www.oasis-open.org/cover/cml1.html

  • TML(Tutorial Markup Language) Specification - http://www.ilrt.bris.ac.uk

  • XLF (Extensible Log Format) Initiative - http://www.docuverse.com/xlf/

  • Metafile for Interactive Documents (MID) - http://www.oasis-open.org/cover/gen-apps.html#mid


  • Использование ASP

    Доступ к свойствам XML- анализатора возможен также из сценариев ASP(Active Server Pages), выполняющихся на стороне сервера. Если при написании ASP-модуля используется язык VBscript, то для создания объекта, представляющего XML- документ, необходимо включить следующее выражение: Set myxml=Server.CreateObject("msxml")
    Однако необходимо учитывать, что в качестве сервера в этом случае надо использовать Web- сервер, поддерживающий ISAPI, и так же на компьютере должны быть установлены или броузер Internet Explorer версии 4 и выше, или зарегистрированный в реестре ActiveX- компонент msxml.
    Вот пример использования свойств XML-документа в ASP- программе:
    <% Set myxml=Server.CreateObject("msxml") myxml.url = "http://localhost/xml/sample1.xml" url=myxml.url Set root=myxml.root version=myxml.version charset=myxml.charset %>
    URL <%=url%>
    Version <%=version%>
    Root element <%=root.tagName%>
    Charset <%=charset%>

    Создавая msxml- объект при помощи CreateObject, мы в дальнейшем вызываем его методы и свойства привычным нам способом. Отличается лишь способ вставки полученной информации в HTML- страницу - она генерируется не на стороне клиента, а приходит к нему в уже готовом виде.
    В заключение хотелось бы отметить, что рассмотренные способы работы с XML- документами могут применяться для отображения их элементов на экране броузера. Не всегда они являются наиболее эффективными для форматирования текста - для каждого нового документа с измененной структурой требуются частично или полностью переписывать обработчик(в следующем разделе мы попробуем использовать для этих же целей стилевые таблицы XSL). Однако использование Java Script позволяет уже сегодня разрабатывать реальные Интернет- приложения, использующие встроенный в броузер клиента анализатор в качестве средства для доступа к структурированной информации XML.
    Назад | Содержание | Вперед

    Использование атрибутов элементов

    Применительно к и в правилах также могут использоваться специальные элементы ;, при помощи которых можно уточнять характеристики обрабатываемых элементов, задавая различные инструкции форматирования для одинаковых элементов с различными атрибутами. Указываемые в параметры name и value определяют атрибут XML, который должен иметь текущий обрабатываемый элемент. Например, в следующем фрагменте все элементы с атрибутом free_lance ="true" будут выделены в выходном HTML- документе серым цветом




    Использование Java Script для HTML

    Создавая шаблон HTML-документа, Вы можете указывать в нем практически любые элементы HTML, в том числе и блоки

    Если использовать эти правила для следующего XML- документа:
    Part1 Part2 Part3
    то в результате мы получим такой HTML-файл:


    Если на Вашем компьютере установлен

    Если на Вашем компьютере установлен броузер Internet Explorer 4 (или более поздняя версия), то Вы можете использовать встроенный в этот броузер XML- анализатор msxml в своих сценариях, написанных на Java Script ил VBScript,. В настоящий момент существуют две его реализации, - одна предназначена для использования в виде написанного на C++ ActiveX- объекта(реализация на базе COM- технологии) другая, написанная на Java, не зависит от платформы. Оба анализатора не сложны, имеют сравнительно небольшой размер - msxml на C++ занимает около 100k, версия на Java - 127k. Анализатор, написанный на C++, в текущей реализации не поддерживает DTD- правил, более компактный и быстрый, чем его Java-версия. Оба они имеют поддержку иностранных языков, т.е. в составе Internet Explorer C++- анализатор работает со всеми языками, "понимаемыми" броузерами, а анализатор на Java - с теми языками, с которыми может работать виртуальная Java-машина.

    Т.к. обе версии разрабатывались параллельно, объектная модель, заложенная в основу каждой из них, внешне схожа, поэтому больших сложностей при переходе от одной версии к другой обычно не возникает.

    Рассмотрим основные свойства и методы, доступные JavaScript- сценарию в процессе его выполнения на стороне броузера. В наших примерах мы будем использовать XML- анализатор в сценариях Java Script, т.к. этот способ более понятен и быстрее работает. Полное описание C++ интерфейсов анализатора доступны в документации по Internet Client SDK

    Использование правил из внешних схем

    Схема может использовать элементы и атрибуты из других схем. Для этого надо использовать атрибут href, в котором указывается название внешней схемы. Например:


    Отображение заголовка документа, определяемого элементом



    Назад | Содержание | Вперед

    Язык XML - практическое введение

    Александр Печерский
  • Введение

  • Для чего нужен новый язык разметки?

  • Структура документа

  • Правила создания XML- документа

  • Конструкции языка

  • Просмотр XML-документов

  • Использование msxml в IE 4

  • Использование ASP
  • Стилевые таблицы XSL

  • DTD - определения

  • Схемы данных


  • Приложение 1

  • Приложение 2

  • Приложение 3

  • Приложение 4

  • Список ресурсов

    Зa неполный год своего официального существования язык XML привлек к себе уже достаточно много внимания со стороны разработчиков и пользователей Интернет. Сегодня количество приверженцев этой новой технологии возрастает также стремительно, как и число сообщений об очередных взятых ею преградах на пути к всеобщему признанию. Несмотря на то, что XML очень молод (международная организация W3C утвердила спецификацию "Extensible Markup Language(XML) 1.0" чуть меньше года назад - в начале февраля 1998 г) и отдельные компоненты этого языка находятся еще в стадии доработки, уже сегодня появляются новые языки, созданные на основе XML, возникают многочисленные Web-сервера, использующие эту технологию для организации хранящейся на них информации. Мир Интернет вокруг нас в очередной раз преображается, и мы можем стать участниками этого процесса уже сегодня
    Целью данной статьи является попытка на конкретных примерах показать некоторые из возможностей XML, ответить на ряд часто возникающих при знакомстве с новым языком вопросов. Что же такое XML? В чем заключаются его преимущества перед привычным уже нам языком HTML? Можно ли использовать XML на своих Web-страничках уже сегодня? А если можно, то как?
    В конце статьи приведены ссылки на другие ресурсы Интернет, с помощью которых Вы сможете также получить более полную информацию по конкретным интересующим Вас вопросам, связанным с применением XML и незатронутых нами в этой статье. Полные спецификации XML и связанных с ним языков доступны на официальной странице W3C - www.w3.org

    Элементы данных

    Элемент - это структурная единица XML- документа. Заключая слово rose в в тэги , мы определяем непустой элемент, называемый , содержимым которого является rose. В общем случае в качестве содержимого элементов могут выступать как просто какой-то текст, так и другие, вложенные, элементы документа, секции CDATA, инструкции по обработке, комментарии, - т.е. практически любые части XML- документа.
    Любой непустой элемент должен состоять из начального, конечного тэгов и данных, между ними заключенных. Например, следующие фрагменты будут являться элементами:
    rose Novosibirsk
    ,а эти - нет:
    rose
    Набором всех элементов, содержащихся в документе, задается его структура и определяются все иерархическое соотношения. Плоская модель данных превращается с использованием элементов в сложную иерархическую систему со множеством возможных связей между элементами. Например, в следующем примере мы описываем месторасположение Новосибирских университетов (указываем, что Новосибирский Университет расположен в городе Новосибирске, который, в свою очередь, находится в России), используя для этого вложенность элементов XML :
    Новосибирск Siberia Новосибирский Государственный Технический Университет
    очень хороший институт Новосибирский Государственный Университет
    тоже не плохой

    Производя в последствии поиск в этом документе, программа клиента будет опираться на информацию, заложенную в его структуру - используя элементы документа. Т.е. если, например, требуется найти нужный университет в нужном городе, используя приведенный фрагмент документа, то необходимо будет просмотреть содержимое конкретного элемента , находящегося внутри конкретного элемента . Поиск при этом, естественно, будет гораздо более эффективен, чем нахождение нужной последовательности по всему документу.

    В XML документе, как правило, определяется хотя бы один элемент, называемый корневым и с него программы-анализаторы начинают просмотр документа. В приведенном примере этим элементом является

    В некоторых случаях тэги могут изменять и уточнять семантику тех или иных фрагментов документа, по разному определяя одну и ту же информацию и тем самым предоставляя приложению-анализатору этого документа сведения о контексте использования описываемых данных. Например, прочитав фрагмент Holliwood
    мы можем догадаться, что речь в этой части документа идет о городе, а вот во фрагменте Holliwood - о забегаловке.

    В случае, если элемент не имеет содержимого, т.е. нет данных, которые он должен определять, он называется пустым. Примером пустых элементов в HTML могут служить такие тэги HTML, как
    ,
    , ;. Необходимо только помнить, что начальный и конечные тэги пустого элемента как бы объединяется в один, и надо обязательно ставить косую черту перед закрывающей угловой скобкой (например, ;)

    Эвристические процедуры

    Самый простой способ определить, является ли тот или иной файл документом XML - открыть его и посмотреть. Это не самый быстрый способ, кроме того, он не подходит для больших наборов документов XML. Но иногда такой путь является единственным, чтобы точно понять, что содержит элементы XML - файл или поток данных. Можно проверить файл или поток с помощью парсера, но это достаточно трудоемкое решение. Несколько простых эвристических процедур, основанных на первых байтах файла, способны дать информацию о том, может ли файл или поток оказаться документом XML и, соответственно, стоит ли проверять его с помощью парсера. Например, каждый корректно созданный документ XML должен начинаться со знака <, который может предваряться пробелом. На практике в начале документов XML обычно можно увидеть одну из следующих конструкций:



  • Проблемы с наборами символов несколько усложняют распознавание. Во всех трех случаях перед этими символами может присутствовать или отсутствовать порядковый знак в виде байта Unicode, причем в различных форматах: UTF-8, а также UTF-16 с прямым или обратным порядком байтов. Более того, могут использоваться числа из любых наборов символов помимо Unicode, в частности из ASCII, ISO-8859-1 (Latin-1) и EBCDIC. Но поскольку эти наборы во многом перекрываются в области символов, которые с наибольшей вероятностью могут оказаться в начале документа XML, все их разнообразие сводится к нескольким общим последовательностям байтов, показанным ниже в шестнадцатеричном формате:
  • FE FF 00 3C 00 3F

  • FF FE 3C 00 3F 00

  • 3C 3F 78 6D

  • EF BB BF 3C 3F

  • 4C 6F A7 94

  • 3C

  • Эти эвристические процедуры отнюдь не являются универсальными. Их наиболее характерная ошибка - идентификация неправильно оформленных документов HTML как возможных файлов XML. Работу этих процедур можно улучшить, если убрать начальные пробелы (знаки табуляции, символ возврата каретки или новой строки и собственно пробел) перед первым знаком < или убедиться, что первый знак после символа < - это ?, ! или одна из возможных первых букв имени XML. На практике, если документ не начинается с одной из выше названных последовательностей, он вряд ли окажется файлом XML. Если контролировать эти символы в первую очередь, то можно отбросить множество лишней информации и сэкономить время за счет того, что парсеры будут проверять только документы, которые с наибольшей вероятностью являются файлами XML.

    Как избежать распространенных ошибок в работе с XML

    На протяжении последних семи лет автору крупно повезло - он имел уникальную возможность следить за развитием и становлением языка XML, и все благодаря своей работе в качестве консультанта, преподавателя и писателя.
    Когда XML был представлен публике впервые, организации и разработчики отнеслись к этому новому языку разметки с вежливым подозрением. Но по мере того как они использовали этот язык для решения все большего числа проблем, подозрительность сменилась энтузиазмом. Сегодня уже очень многие разработчики и организации используют XML в своих проектах.
    К сожалению, вместе с растущей популярностью возникли и проблемы, связанные с неправильным применением XML. В этом отношении процесс внедрения XML не отличается от внедрения других технологий. Первые пользователи любой новой технологии обычно являются ее энтузиастами (и они должны быть таковыми, если хотят убедить коллег и потребителей в преимуществах этой технологии). Но у них также могут быть и сомнения, поэтому они обычно стараются изучить, как лучше всего внедрять новую технологию.
    По мере развития технологии она все больше воспринимается как должное. И, соответственно, чем шире используется технология с разными приложениями, тем больше совершается ошибок. К счастью, одновременно накапливается и опыт работы с этой технологией, и появляются проверенные решения для наиболее часто возникающих проблем. Эти решения документируются, так же как и наиболее распространенные проблемы.
    Автор выражает уверенность в том, что его опыт в решении часто возникающих проблем поможет читателям избежать этих ошибок.
    Предлагаемая статья освещает общие проблемы XML. Приверженность общепринятому синтаксису - это первый шаг на пути создания надежных приложений. Ниже рассматриваются следующие общие вопросы:
  • использование парсеров и управляющие последовательности для зарезервированных символов;

  • кодировка;

  • пространства имен.


  • Как это выглядит

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

    Если мы включим приведенные правила внутрь XML- документа, программа-клиент сможет использовать их для проверки. Т.е. она теперь сможет определить, что правильным будет являться следующий фрагмент:
    My computer My family My dog
    , а некорректным этот:
    My family My dog Sharik
    Все конструкции языка схем описываются правилами "XML DTD for XML-Data-Schema". Этот документ вы можете найти среди другой официальной документации, доступной на сервере W3 - консорциума. В этой статье мы коснемся лишь основных приемов для работы со схемами данных. Ссылки на более подробные источники приведены в конце.

    Как выглядит XML-документ?

    Если Вы знакомы с HTML, изучение XML не потребует от вас особых усилий. Хотя XML, безусловно, сильно отличается по своим возможностям и предназначению от языка гипертекстовой разметки, оба эти языка являются подмножествами SGML, и, следовательно, наследуют его базовые принципы.

    Структура документа
    Простейший XML- документ может выглядеть так, как это показано в Примере 1
    Первый Второй подпункт 1 Третий Последний
    Обратите внимание на то, что этот документ очень похож на обычную HTML-страницу. Также, как и в HTML, инструкции, заключенные в угловые скобки называются тэгами и служат для разметки основного текста документа. В XML существуют открывающие, закрывающие и пустые тэги (в HTML понятие пустого тэга тоже существует, но специального его обозначения не требуется).
    Тело документа XML состоит из элементов разметки (markup) и непосредственно содержимого документа - данных (content). XML - тэги предназначены для определения элементов документа, их атрибутов и других конструкций языка. Более подробно о типах применяемой в документах разметки мы поговорим чуть позже.
    Любой XML- документ должен всегда начинаться с инструкции , внутри которой также можно задавать номер версии языка, номер кодовой страницы и другие параметры, необходимые программе-анализатору в процессе разбора документа



    Комментариями является

    Комментариями является любая область данных, заключенная между последовательностями символов Комментарии пропускаются анализатором и поэтому при разборе структуры документа в качестве значащей информации не рассматриваются.

    Компоненты схем

    Компоненты, или макроопределении, используются в схемах точно также, как и в DTD. Для их определения предназначены тэги и ;:
    Новосибирский Межотраслевой Региональный Центр Переподготовки Кадров

    Конструкции языка

    Содержимое XML- документа представляет собой набор элементов, секций CDATA, директив анализатора, комментариев, спецсимволов, текстовых данных. Рассмотрим каждый из них подробней.

    Корневое правило

    Разбор любого XSL- документа всегда начинается с правила для корневого элемента, в котором определяется область всего разбираемого XML документа и поэтому тэги форматирования, помещенные сюда, будут действовать на весь документ в целом. Для обозначения корневого правила необходимо включить в него элемент ;. Например, для того, чтобы задать тэг для формируемой нами выходной HTML- страницы, мы можем использовать следующий фрагмент:
    Flowers
    В этом примере при помощи инструкций и мы определили ряд начальных и конечных HTML-тэгов для нашей страницы, между которыми затем в процессе рекурсивного обхода XSL- анализатора будут помещены остальные элемента документа.
    В том случае, если мы не определяем правило для корневого элемента, разбор документа начнется с первого правила с инструкцией (для оформления же заголовка документа будет использован образец форматирования, применяющийся по умолчанию).

    Microsoft XML

  • Inside the XML 1.0 Specification - http://www.xml.com/xml/pub/axml/axmlintro.html

  • XML Overview - http://www.microsoft.com/xml/OVERVIEW.asp

  • XML Data types - http://www.microsoft.com/workshop/xml/schema/reference/datatypes.asp

  • Microsoft XML Tutorial - http://www.microsoft.com/xml/tutorial/default.asp

  • Building XML Parsers for Microsoft's IE4 - http://w3j.com/xml/excerpt.html

  • XML 1.0 and Namespace Support - http://www.microsoft.com/xml/xml10andNameSpaceSupport.asp


  • Модель содержимого элемента

    Под моделью содержимого в схеме данных понимают описание всех допустимых объектов XML- документа, использование которых внутри данного элемента является корректным. Модель содержимого определяется инструкциями, расположенными внутри блока .

    Для этого правила корректным будет являться следующий фрагмент документа:
    Психи и маньяки в Интернет

    Вложенные элементы описываются при помощи инструкции element, в которой параметром type указывается класс объекта - ссылка на его определение:

    Если требуется указать режим использования вложенного элемента, то надо определить параметр occurs:

    Возможные значения этого параметра таковы:
  • REQUIRED - элемент должен быть обязательно определен
  • OPTIONAL - использование элемента не является обязательным
  • ZEROORMORE - вложенный элемент может встречаться несколько раз или ни разу
  • ONEORMORE - элемент должен встречаться хотя бы один раз

  • Примеры правильных XML-документа, использующих приведенную выше схему:
    Зачем он нужен, XML? Иван Петров Что такое XML нужен ли он нам

    или
    Зачем он нужен, XML? Что такое XML

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

  • - указывает на то, что содержимым элемента является только свободная текстовая информация(секция PCDATA) :



  • - указывает на то, что содержимым элемента должны являться только элементы, без текста, незаключенного ни в один элемент:



  • - любое сочетание элементов и текста



  • - пустой элемент


  • Пример:



    О типах данных, которые можно определять с помощью схем, мы поговорим чуть позже

    Модели хранения XML-данных: единственного варианта на все случаи нет

    Марк Скардина, Oracle Magazine RE Январь/Февраль 2004

    (XML Storage Models: One Size Does Not Fit All, by Mark Scardina)
    Источник: Oracle Technology Network, журнал “Oracle Magazine”, раздел article_online_only, 02 июля 2003,
    Выбор модели хранения XML-данных для вашего приложения может определить его успех или неудачу
    Подобно многим протоколам, файловым системам и технологиям World Wide Web, Extensible Markup Language (XML) – расширяемый язык разметки – прошел путь от скромного старта к широкому применению за сравнительно короткий период времени.
    Первоначально получивший известность среди публикаторов в Web как технология совместного использования документов, XML развился в среду хранения и передачи данных, признанную во всей отрасли.
    Когда-то документы, публикуемые в Web, состояли почти только из текстов и изображений, ныне же эти документы (уже на основе XML) становятся наиболее предпочитаемой средой для доставки данных, выбранных из баз данных внутренних (back end) систем, а также приложений и документов среднего (middle tier) уровня и внешних (front end) систем.
    Но теперь XML начинает проникать и в базы данных, становясь обязательным элементом структур хранения данных.
    Если раньше наборы разработчиков Oracle XML Developers Kits (XDKs) использовались для оперирования с данными в формате XML (или XML-данными) вне баз данных, то в настоящее время разработчики приложений могут распределять обработку этих данных между всеми уровнями, на которых используются интерфейсы прикладного программирования этих наборов -- XDK APIs либо интерфейсы SQL XML.

    Нет волшебных пуль

    XML DB в СУБД Oracle – это наиболее продвинутая реализация XML в СУБД и предлагает широкую функциональность, сравнимую с моделями хранения CLOB или XMLType Views. Для приложений подобных тем, которые перечислены в верхней врезке, XML DB предлагает разработчикам мощное и эффективное решение для хранения, запрашивания и манипулирования XML-данных таким способами, которые ранее были невозможны.
    Я сравнил и выявил особенности трех различных моделей хранения для XML-данных в СУБД, реализованных в Oracle9i Database Rel 2 чтобы дать вам лучшее представление о том, что лучше соответствует вашим целям. Тщательно выбирайте, исходя из потребностей ваших приложений; и не ориентируйтесь на последние новинки других компаний, преподносимых как полные решения для интеграции XML-документов и баз данных – это очень важно. Такой выбор буквально может означать разницу между созданием успешного прототипа и его внедрением в производство.
    Марк Скардина (Mark Scardina), проповедник (Evangelist) XML для серверных продуктов Oracle. Он менеджер группы продуктов в подразделении CORE and XML Development Group, его задачи – обеспечение компонентов XML-инфраструктуры, используемых во всех продуктах Oracle, включая XML Developer's Kits. Марк возглавляет комитет Oracle XML Standards и является редактором рабочей группы по W3C XSL. Он часто выступает на отраслевых форумах и конференциях и является соавтором книги The Oracle9i XML Handbook (Oracle Press, 2001).

    Об авторе

    Эллиотт Расти Хэролд (Elliotte Rusty Harold) - адъюнкт-профессор в области теории вычислительных машин и систем Политехнического университета в Бруклине. Он преподает технологию Java и объектно-ориентированное программирование. Он также поддерживает два сайта: Cafe au Lait - один из наиболее популярных независимых сайтов по Java и Cafe con Leche - один из наиболее популярных сайтов по XML. Эллиотт - автор нескольких книг: "Эффективная работа с XML" (Effective XML), "Обработка документов XML с помощью Java" (Processing XML with Java), "Сетевое программирование на Java" (Java Network Programming) и "Библия XML 1.1" (The XML 1.1 Bible). В настоящее время он работает над XOM API для обработки документов XML, а также над инструментами формирования запросов XQuisitor GUI. С автором статьи можно связаться по адресу elharo@metalab.unc.edu.

    Перед тем, как использовать свойства

    Перед тем, как использовать свойства и методы анализатора, его необходимо создать. Делается это при помощи стандартного метода, предназначенного для создания ActiveX- объектов: var mydoc = new ActiveXObject("msxml");

    Если ActiveX- компонент был зарегистрирован на Вашей машине(или у Вас установлен броузер Internet Explorer 4), то в результате выполнения этой функции переменной mydoc будет присвоен объект, имеющий тип msxml, свойства и методы которого используются в дальнейшем для получения доступа к структуре XML- документа.

    В Приложении 2 приведен полный текст сценария JavaScrtipt, выводящего на экран броузера Internet Explorer 4.0 XML- документ, созданный в Приложении 1. Вы можете использовать этот пример и комментарии к нему в качестве еще одного средства для более быстрого понимания принципов использования свойств и методов объектов Microsoft XML и создания собственных сценариев.

    Объектная модель XML- анализатора Microsoft может быть представлена в виде следующего набора внутренних объектов: XML Document, XML Element и Element Collection. Объект XML Document содержит свойства и методы, необходимые нам для работы с XML- документом в целом. XML Element отвечает за работу с каждым из элементов XML- документа. Element Collection представляет из себя набор элементов, доступ к которым доступен при помощи имени или порядкового номера. В следующих примерах мы рассмотрим каждый из этих объектов подробнее.

    Область схемы данных

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

    Если использовать отдельное пространство имен, то полный XML-документ, содержащий в себе схему данных, будет выглядеть следующим образом:


    Официальная документация

  • XML - http://www.w3.org/TR/1998/REC-xml-19980210

  • XML v. 1.0 DTD - http://www.w3.org/XML/1998/06/xmlspec-19980910.dtd

  • XSL - http://www.w3.org/TR/1998/WD-xsl-19980818

  • Document Object Model (DOM) Level 1 Specification - http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/

  • SGML-XML - http://www.w3.org/TR/NOTE-sgml-xml

  • Document Content Description for XML - http://w3c.org/TR/NOTE-dcd

  • CSS2 - http://www.w3.org/TR/REC-CSS2

  • HTML - http://www.w3.org/TR/1998/REC-xml-19980210.html

  • Channel Definition Format (CDF) - http://www.microsoft.com/standards/cdf.htm

  • ISO 8879. Information Processing -- Text and Office Systems - Standard Generalized Markup Language (SGML), 1986. - http://www.iso.ch/cate/d16387.html

  • Namespaces in XML World Wide Web Consortium Working Draft 16-September-1998 - http://www.w3.org/TR/WD-xml-names

  • XML-Data W3C Note 05 Jan 1998 - http://www.w3.org/TR/1998/NOTE-XML-data-0105/


  • Ограничения на значения

    Значения элементов могут быть ограничены при помощи тэгов и ;:
    0100
    Внутри этих элементов могут указываться и символьные ограничения:
    AZ

    Описание элементов

    Для определения класса элемента, к которому в дальнейшем будут применяться инструкции, описывающие его содержимое и структуру, предназначен специальный элемент схемы elementType,
    Элемент содержит информацию об очередном выпуске журнала
    Название элемента задается атрибутом id . Все дальнейшие инструкции, которые относятся к описываемому классу, определяют его внутреннюю структуру и набор допустимых данных, содержатся внутри блока, заданного тэгами и . Мы рассмотрим эти инструкции чуть позже.
    Как видно из примера, при определении класса элемента, можно также использовать комментарии к нему, которые заключаются в тэги <descript>

    Определение атрибутов

    Списки атрибутов элемента определяются с помощью ключевого слова !ATTLIST. Внутри него задаются названия атрибутов, типы их значений и дополнительные параметры. Например, для элемента
    могут быть определены следующие атрибуты:

    В данном примере для элемента article определяются три атрибута: id, about и type, которые имеют типы ID(идентификатор), CDATA и список возможных значений соответственно. Всего существует шесть возможных типов значений атрибута:
  • CDATA - содержимым документа могут быть любые символьные данные
  • ID - определяет уникальный идентификатор элемента в документе
  • IDREF( IDREFS )- указывает, что значением атрибута должно выступать название(или несколько таких названий, разделенных пробелами во втором случае) уникального идентификатора определенного в этом документе элемента
  • ENTITY( ENTITIES) - значение атрибута должно быть названием(или списком названий, если используется ENTITIES) компонента (макроопределения), определенного в документе
  • NMTOKEN (NMTOKENS) - содержимым элемента может быть только одно отдельное слово(т.е. этот параметр является ограниченным вариантом CDATA)
  • Список допустимых значений - определяется список значений, которые может иметь данный атрибут.

  • Также в определении атрибута можно использовать следующие параметры:
  • #REQUIRED - определяет обязательный атрибут, который должен быть задан во всех элементах данного типа
  • #IMPLIED - атрибут не является обязательным
  • #FIXED "значение" - указывает, что атрибут должен иметь только указанное значение, однако само определение атрибута не является обязательным, но в процессе разбора его значение в любом случае будет передано программе-анализатору
  • Значение - задает значение атрибута по умолчанию


  • Определение функций и глобальных переменных

    Аналогично тэгу
    Как видно из примера, в процессе обработки XML- документа необходимо рекурсивно обходить все ветви создаваемого анализатором дерева, причем, на каждом шаге возможны следующие ситуации:
  • Встретился новый элемент. В этом случае его название(задаваемое тэгом) доступно при помощи свойства tagName, а содержимое - свойством text. У любого непустого элемента существует хотя бы один потомок, представляющий собой содержимое этого элемента(в этом отличие представленной объектной модели msxml от реальной структуры документа - в XML под элементом понимается как название тэга, так и текстовое содержимое его)
  • Встретилось текстовое поле. Это поле может быть либо комментарием, либо просто текстом, содержащемся в текущем элементе

  • Для обработки потомков текущего элемента используется метод item(), который вызывается в цикле столько раз, сколько потомков у текущего элемента. Обработка каждого дочернего элемента осуществляется вызовом этой же функции, в чем и заключается рекурсия.

    Пример XML-документа

    Very Useful Journal
    sdsds
    8-3232-121212 8-3232-121212 j@j.ru www.j.ru

    XML today 12.09.98 XML www.j.ru/issues/
    Issue overview /article1
    language marckup hypertext

    Latest reviews /article2

    <url/><br> <hotkeys/> </article> </articles> </issue> </issues-list> <authors-list><br> <author ID="1"> <firstname>Ivan</firstname> <lastname>Petrov</lastname> <email>vanya@r.ru</email> </author><br> <author ID="3"> <firstname>Petr</firstname> <lastname>Ivanov</lastname> <email>petr@r.ru</email> </author><br> <author ID="4"> <firstname>Sidor</firstname> <lastname>Sidorov</lastname> <email>sidor@r.ru</email> </author> </authors-list> </journal><br> Назад | Содержание | Вперед<br><br> <h1>Пример XSL-документа</h1> <xsl> <!-- Корневое правило --> <rule> <root/> <HTML><head> <link rel="canonical" href="https://www.e-lave.ru//index.htm"/> <!-- Область сценария--> <SCRIPT LANGUAGE="JSCRIPT"><![CDATA[ var ie4=((navigator.appName=="Microsoft Internet Explorer")&&(parseInt(navigator.appVersion) >= 4 )); function msover(){ if (ie4){ event.srcElement.style.color="red"; event.srcElement.style.cursor = "hand"; } } function msout(){ if (ie4){ event.srcElement.style.color="black"; event.srcElement.style.cursor = "auto"; } } ]]></SCRIPT> </HEAD> <BODY bgcolor="white"> <center> <table width="80%" border="1"> <children/> </table></center> </BODY> </HTML> </rule> <!-- Использование элемента select-elements --> <rule> <target-element type="journal"/> <select-elements> <target-element type="title"/> </select-elements>, <select-elements> <target-element type="contacts"/> </select-elements>, <select-elements> <target-element type="issues-list"/> </select-elements>, <select-elements> <target-element type="authors-list"/> </select-elements>. </rule> <!-- Formatting title element --> <rule> <element type="journal"> <target-element type="title"/> <!-- Элемент title должен определяться внутри элемента journal --> </element> <tr><td align="center"><center> <table width="80%" border="1"><tr><td width="100%"> <b><font color="blue"> <children/> </font></b></td></tr> </table></center> </td></tr> </rule> <!-- Issues list --> <rule> <element type="journal"> <target-element type="issues-list"/> </element> <tr><td align="center"> <children/> </td></tr> </rule> <rule> <element type="issues-list"> <target-element type="issue"/> </element> <tr><td><center> <table width="100%" border="0"> <tr><td colspan="2" bgcolor="gray"> <font color="white">Issues list</font></td></tr> <children/> <tr><td> </td></tr></table></center></td></tr> </rule> <rule> <target-element type="issue"/> <tr><td> <table width="100%" border="0"> <tr><td colspan="2">Issue number <b><eval>childNumber(this);</eval></b></td></tr> <children/> <tr><td> </td></tr></table></td></tr> </rule> <rule> <element type="issue"> <target-element type="title"/> <target-element type="date"/> <target-element type="about"/> <target-element type="home-url"/> </element> <tr> <td width="40%"><font color="blue"><eval>tagName</eval></font></td> <td width="60%" align="right"><div align="right"><b><font color="red"> <children/></font></b> </div></td></tr> </rule> <rule> <element type="issue"> <target-element type="articles"/> </element> <tr><td colspan="2" align="right" bgcolor="silver"> <center>Articles list</center></td></tr> <children/> </rule> <rule> <element type="articles"> <target-element type="article"/> </element> <tr><td colspan="2" align="right">Article number <b><eval>childNumber(this);</eval></b></td></tr> <children/> </rule> <rule> <element type="article"> <target-element type="title"/> <target-element type="url"/> <target-element type="author"/> </element> <tr> <td width="40%"><font color="maroon"><eval>tagName</eval></font></td> <td width="60%" align="right"><div align="right"><b><font color="red"> <children/></font></b> </div></td></tr> </rule> <rule> <target-element type="article" position="last-of-type"/> <children/> <tr><td colspan="2" bgcolor="silver" width="100%"> </td></tr> </rule> <rule> <element type="hotkeys"> <target-element type="hotkey"/> </element> <tr> <td width="40%"><font color="maroon"><eval>tagName</eval></font></td> <td width="60%" align="right"><div align="right"><b><font color="red"> <children/></font></b> </div></td></tr> </rule> <!-- Contacts --> <rule> <element type="journal"> <target-element type="contacts"/> <select-elements> <target-element type="address"/> </select-elements>, <select-elements> <target-element type="tel"/> </select-elements>, <select-elements> <target-element type="email"/> </select-elements>, <select-elements> <target-element type="url"/> </select-elements>. </element> <tr><td><center><table width="100%" border="1"> <tr><td colspan="2" bgcolor="gray"><font color="white">Contact us:</font></td></tr> <children/> <tr><td> </td></tr></table></center></td></tr> </rule> <rule> <element type="contacts"> <target-element type="address"/> <target-element type="tel"/> <target-element type="email"/> <target-element type="url"/> </element> <tr> <td width="40%"><font color="blue"><eval>tagName</eval></font></td> <td width="60%" align="right"><div align="right"><b><font color="red"> <children/></font></b> </div></td></tr> </rule> <!-- Authors --> <rule> <element type="journal"> <target-element type="authors-list"/> </element> <tr><td bgcolor="gray"><font color="white">Authors list</font></td></tr> <tr><td> <children/> </td></tr> </rule> <rule> <element type="authors-list"> <target-element type="author"/> <select-elements> <target-element type="firstname"/> </select-elements>, <select-elements> <target-element type="lastname"/> </select-elements>, <select-elements> <target-element type="email"/> </select-elements>. </element> <table width="100%" border="1"> <tr><td colspan="2">Author index <b><eval>getAttribute("ID");</eval></b></td></tr> <children/> <tr><td> </td></tr></table> </rule> <rule> <element type="author"> <attribute name="ID" has-value="yes"/> <target-element type="firstname"/> <target-element type="lastname"/> <target-element type="email"/> </element> <tr> <td width="40%"><font color="blue"><eval>tagName</eval></font></td> <td width="60%" align="right"><b><font color="black"> <!-- Подсветка элементов --> <DIV id='=tagName + formatNumber(childNumber(this),"1")' background-color="marron" onmouseover='="msover("+ tagName + formatNumber(childNumber(this),1)+")"' onmouseout='="msout("+ tagName + formatNumber(childNumber(this),1)+")"'> <children/> </DIV> </font></b> </td></tr> </rule> <!-- Определение стиля. Изменение стиля комнется всех элементов title и url, вне зависимости от их месторасположения --> <style-rule> <target-element type="title"/> <target-element type="url"/> <apply font-style="italic" color="maroon"/> </style-rule> </xsl><br> Назад | Содержание | Вперед<br><br> <h1>Приоритеты правил</h1> В том случае, если внутри XSL- документа встречается несколько правил для одного и того же элемента, то msxsl будет использовать то из них, которое более точно определяет позицию данного элемента. Т.е. если XSL- документ содержит следующие правила:<br> <rule> <element type="journal"> <target-element type="title"/> </element> <center> <hr width=80%> <children/> <hr width=80%> </center> </rule> <rule> <target-element type="title"/> <b> <children/> </b> </rule><br> , то при использовании этой стилевой таблицы в случае, когда элемент <title> является потомком <journal>, к нему будет применено первое правило. Для любых же других элементов будет действовать правило без тэга <element><br> В общем случае приоритет правил определяется следующим образом (в порядке убывания приоритета): <br> <li>правила, помеченные специальным тэгом <importance></li> <li>правила с наибольшим значением атрибута id, если он определен</li> <li>правила с наибольшим значением атрибута class, если он определен</li> <li>правила, имеющие наибольшую вложенность, определяемую тэгом <element></li> <li>правила, использующие атрибут type совместно с <target-element></li> <li>правила, в которых отсутствует атрибут type в <target-element> или <element></li> <li>правила с более высоким приоритетом, задаваемым атрибутом priority тэга <rule></li> <li>правила с наибольшим значением квалификаторов <only>, <position>, <attribute></li> <br><br> <h1>Проблемы кодировки</h1> Более серьезные проблемы могут возникнуть при использовании различных кодировок. Разработчики часто упускают из виду тот факт, что кодировки не ограничивают тот набор символов, который поддерживает XML. Любой документ XML поддерживает полный набор символов Unicode (16- или 32-битные символы в XML 1.1). <br> Использование кодировок в документе XML может сократить его размер, но при этом, благодаря наличию символьных сущностей, в нем могут оказаться не только символы Unicode. С помощью этих символов можно вставить любую букву из таблицы Unicode, даже если в документе используется наиболее строгая кодировка (US-ASCII, которая подходит только для четырех языков - английского, гавайского, латинского и суахили). <br> Это действительно проблема, поскольку если приложения Java или последняя версия DB2R могут поддерживать Unicode, то более ранние приложения почти не способны на это. Таким образом, если документ XML передается в "старое" приложение, придется столкнуться с Unicode. Соответственно, использование кодировок не является решением, поскольку, как показано выше, всегда можно избежать специальных символов за счет символьных сущностей. <br> Поскольку переписывание старого приложения редко используется как решение проблемы, необходим способ конвертирования, который превратит символы Unicode в набор, приемлемый для приложения: например, конвертирование i в обычную i (т.е. убирание диакритического знака). Большинство парсеров XML имеют возможности для обработки символов Unicode. <br><br> <h1>Проблемы пространства имен</h1> Третий источник проблем, который обсуждается в настоящей статье, - это использование пространств имен XML. <br> Пространства имен были введены для управления словарями XML и предотвращения использования тэгов с одинаковыми именами. Часто два словаря могут использовать один и тот же тэг в разных контекстах. Например, в словаре сообщений могут быть тэги для темы, даты, отправителя, адресата и тела письма (см. листинг 2), а в словаре цифровых ресурсов - тэги для темы, даты, описания, камеры и номера кадра (см. листинг 3). <br> <b>Листинг 2. Словарь сообщений</b><br> <envelope> <subject>Test memo</subject> <date>April 26, 2005</date> <from>jack@writeit.com</from> <to>john@xmli.com</to> <body>memo body goes here</body><br> </envelope><br> <b>Листинг 3. Словарь цифровых ресурсов</b><br> <photo> <subject>Westlicht Museum of Camera and Photography, Vienna</subject> <date>April 25, 2005</date> <description>Lobby of the museum</description> <camera>Nikon D70</camera><br> <frame>5643</frame> </photo><br> Конфликты возникают, если цифровой ресурс посылается через платформу для обмена сообщениями, поскольку программное обеспечение не может отличить друг от друга тэги темы и даты в двух словарях. Другими словами, имя тэга не является глобальным идентификатором.<br> Пространства имен XML превращают локальные имена в глобальные путем добавления глобального идентификатора к имени тэга. Для того чтобы гарантировать уникальность глобальных идентификаторов, они должны представлять собой URI (Uniform Resource Identifiers - универсальные идентификаторы ресурсов) (т.е. содержать имя домена, зарегистрированного для гарантии уникальности). Соответствующий пример приведен в листинге 4. <br> <b>Листинг 4. Сочетание словарей</b><br> <env:envelope xmlns:env="http://psol.com/2005/env" xmlns:ph="http://psol.com/2005/photo"> <env:subject>Latest photo</env:subject> <env:date>April 27, 2005</env:date> <env:from>jack@writeit.com</env:from> <env:to>john@xmli.com</env:to><br> <env:body> <ph:photo> <ph:subject>Westlicht Museum of Camera and Photography, Vienna</ph:subject> <ph:date>April 25, 2005</ph:date> <ph:description>Lobby of the museum</ph:description><br> <ph:camera>Nikon D70</ph:camera> <ph:frame>5643</ph:frame> </ph:photo></env:body> </env:envelope><br> Здесь есть два момента, которые требуют дополнительных пояснений:<br><li>URI - это идентификатор, а не адрес;</li><br> <li>префикс - это не идентификатор.</li><br><br> <h1>Просмотр XML - документов</h1> Как уже отмечалось, в отличии от HTML, XML никак не определяет способ отображения и использования описываемых с его помощью элементов документа, т.е. программе-анализатору предоставляется возможность самой выбирать нужное оформление. Этого требует принцип независимости определения внутренней структуры документа от способов представления этой информации. Например, задавая в документе элемент <flower>роза</flower>, мы лишь указываем, что rose в данном случае является цветком, но информации о том, как должен выглядеть данный элемент документа на экране клиента и должен ли он отображаться вообще, в таком определении нет.<br> Для того, чтобы использовать данные, определяемые элементами XML, например, отображать их на экране пользователя, необходимо написать программу-анализатор, которая бы выполняла эти действия. Уже сегодня таких программ появилось достаточное количество и у разработчиков существует возможность выбора наиболее подходящей из них для решения конкретных проблем<br> Как уже отмечалось ранее, в общем случае, программы- анализаторы можно разделить на две группы: верифицирующие(т.е. использующие DTD- описания для определения корректности документа) и не верифицирующие. Если Вы создаете свой язык и описываете его грамматику на основе DTD, то для анализа документов, написанных на этом языке, безусловно, потребуется программа, проверяющая корректность составления документа. Но так как использование DTD в XML не является обязательным, то любой правильно оформленный документ может быть распознан и разобран программой, предназначенной для анализа XML- документов. В любом случае, используя универсальные XML- анализаторы, Вы можете быть уверенным в том, что если заданные в документе конструкции языка являются синтаксически правильными, то программа-анализатор сможет правильно извлечь определяемые ими элементы документа и передать их прикладной программе, выполняющей необходимые действия по отображению. Т.е. после разбора документа в большинстве случаев, Вам предоставляется объектная модель, отображающая содержимое Вашего документа, и средства, необходимые для работы с ней (прохода по дереву элементов). При этом в некоторых анализаторах способ представления структуры документа основывается на спецификации DOM, описанной в[]. Поэтому у Вас появляется также возможность использовать строгую иерархическую модель DOM для построения собственных документов.<br> Если речь идет о способах отображения информации, хранящейся в XML, то необходимо упомянуть разрабатываемый в настоящее время W3C стандарт стилевых таблиц для XML, которые предназначены для описания правил отображения элементов XML. Более подробно мы поговорим об XSL чуть позже. <a name="p1"></a><br><br> <h1>Простой синтаксис</h1> В первом разделе обсуждаются некоторые общие вопросы синтаксиса XML. <br> Синтаксис XML достаточно простой: просто необходимо соблюдать баланс между открывающими и закрывающими тэгами. Тем не менее автор очень хотел бы получать знаменитый пятицентовик всякий раз получая электронное письмо, отправитель которого сетует на то, что ему не удалось обработать прилагаемый к письму документ XML ни одним из известных ему парсеров. Неизменно при открытии присланного документа XML автор обнаруживает очевидную синтаксическую ошибку - пустой тэг без закрывающей косой черты (например: <empty/>). Если в документе не соблюдаются все правила синтаксиса XML, то он не является документом XML и, значит, не может быть обработан с помощью инструментов XML. Синтаксис XML очень точный и формальный. Все очень просто: либо в документе соблюдаются все правила синтаксиса XML, либо он не может быть распознан как документ XML.<br> Но некоторые приложения могут отказываться работать с абсолютно точно допустимыми документами. Такие приложения могут реализовывать синтаксис XML не полностью и, соответственно, быть неспособным распознать некоторые символьные сущности (например, i). <br> Проблема заключается в кажущейся простоте XML. Часто кажется, что проще и быстрее что-либо убрать, чем изучить какой-то новый компонент. Такой подход может работать в замкнутом цикле, когда приложение имеет дело с документом, созданный самим этим приложением. Но в промышленной эксплуатации, когда документ обрабатывается несколькими приложениями, этот подход уже вряд ли окажется успешным. <br><br> <h1>Решения и исправления</h1> К счастью, всех этих проблем можно полностью избежать, используя парсер XML. Парсеры XML доступны во всех языках программирования (даже Cobol поддерживает XML), поэтому их безусловно стоит использовать. <br> У разработчика обычно есть две возможности: парсер XML или компонент преобразования. Если необходим контроль чтения документа XML низкого уровня, то лучше использовать парсер. Настоящий парсер XML является единственной гарантией того, что каждый документ XML будет правильно прочитан. <br> Если такой тщательный контроль, который обеспечивает парсер, не требуется, то компонент преобразования (такой как JAXB, Castor или Axis) может оказаться удобнее. Эти компоненты напрямую преобразуют тэги XML в объекты JavaTM. JAXB и Castor работают с документами в файлах, а Axis - с web-сервисами. Компоненты преобразования включают парсер XML, поэтому они полностью поддерживают синтаксис XML. <br> Хотя автор рекомендует использовать парсеры для чтения документов XML, он также признает, что этого можно избежать, если пользователь создает собственный способ для записи документов. Чтение документов XML - достаточно сложная задача, поскольку читающее программное обеспечение должно поддерживать полный синтаксис XML. Напротив, создание документов XML - это сравнительно более легкая процедура, поскольку можно использовать только часть синтаксических возможностей. Например, если пользователю не требуются атрибуты, то и не возникает необходимости в их поддержке; если не нужно многожество кодировок, то их также можно не поддерживать, и т.д.<br> Единственная опасность в этом подходе - это то, что нужно корректно передавать зарезервированные символы (см. табл. 1). Особое внимание нужно обращать на символы сущностей (например, i), поскольку они зависят от кодировки документа (см. раздел "Проблемы кодировки" ниже).<br> <b>Таблица 1. Зарезервированные символы</b><br> <table border=1><br> <tr> <td><b>Символ</b></td> <td><b>Управляющая последовательность</b></td> <td><b>Примечания</b></td> </tr> <tr> <td><</td> <td><</td> <td> </td> </tr> <tr> <td>&</td> <td>&</td> <td> </td> </tr> <tr> <td>></td> <td>></td> <td> </td> </tr> <tr> <td>'</td> <td>'</td> <td>Только в атрибутах, если символ " используется как разделитель</td> </tr> <tr> <td>"</td> <td>"</td> <td>Только в атрибутах, если символ ' используется как разделитель</td> </tr> <tr> <td>другие</td> <td>&#unicode;</td> <td>Любой символ, не поддерживаемый данной кодировкой</td> </tr> </table>< <br> br><br> Обычно достаточно простого цикла, аналогичного приведенному в листинге 1. Данную функцию можно применять более эффективно, но листинг 1 синтаксически корректен, если документ создается для потока UTF-8 или UTF-16 (в противном случае необходимо также передать некоторые символы за счет использования символьных сущностей).<br> Листинг 1. Применение стандартного алгоритма избегания<br> // assumes UTF-8 or UTF-16 as encoding, public String escape(String content) { StringBuffer buffer = new StringBuffer(); for(int i = 0;i < content.length();i++) { char c = content.charAt(i); if(c == '<') buffer.append("<"); else if(c == '>') buffer.append(">"); else if(c == '&') buffer.append("&"); else if(c == '"') buffer.append("""); else if(c == '\'') buffer.append("'"); else buffer.append(c); } return buffer.toString(); }<br> Некоторые разработчики предпочитают использовать секции CDATA вместо управляющей последовательности. CDATA - это механизм, который показывает, что часть документа может содержать незаменяемые зарезервированные символы. Например: <condition>< ! [CDATA [a > 4] ] > < / condition>. Этот способ менее надежен, чем управляющая последовательность, т.к. одна секция CDATA не может включать другую такую же секцию.<br> В качестве еще одного решения автор рекомендует преобразователь (transformer), для чего предлагает познакомиться со своей статьей "Реализация XMLReader" (Implement XMLReader).<br><br> <h1>Ресурсы</h1> <li>Многоцелевые расширения почтовых сообщений Internet. Часть 2: типы электронной корреспонденции (RFC 2046, Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types).</li><br> <li>Общественный регистр типов электронной корреспонденции (MIME type registry).</li><br> <li>Типы электронной корреспонденции XML (RFC 3023, XML Media Types).</li><br> <li>Архитектура всемирной сети, том 1 (Architecture of the World Wide Web, Volume One).</li><br> <li>Улучшенный способ идентификации типов файлов, изобретенный фирмой Apple Computer двадцать лет назад. Он также описан в книге "Внутри Macintosh: основы инструментальных панелей" (Inside Macintosh: Macintosh Toolbox Essentials): глава 7 - "Интерфейс поиска" (Finder Interface).</li><br> <li>Опыт использования операционной системы BeOS в проекте Haiku.</li><br> <li>Библия XML 1.1 (XML 1.1 Bible). Книга также доступна в интернет-магазине Amazon.com.</li><br> <li>DB2R - программное решение IBM для управления информацией, основанное на совокупности мощных серверов систем управления реляционными базами данных. </li><br> <li>Дополнительные ресурсы по XML на сайте IBM (developerWorks XML zone).</li><br> <li>Информация о том, как стать Сертифицированным разработчиком IBM в области XML и других смежных технологий (IBM Certified Developer in XML and related technologies).</li><br><br> <h1>С чего начать</h1> Принцип обработки XML- документов стилевыми таблицами заключается в следующем: при разборе XSL-документа программа-анализатор обрабатывает инструкции этого языка и каждому элементу, найденному в XML- дереве ставит в соответствие набор тэгов, определяющих форматирование этого элемента. Другими словами, мы задаем шаблон форматирования для XML- элементов, причем сам этот шаблон может иметь структуру соответствующего фрагмента XML-документа. Инструкции XSL определяют точное месторасположение элемента XML в дереве, поэтому существует возможность применять различные стили оформления к одинаковым элементам, в зависимости от контекста их использования. На рисунке 3.1 представлена схема, иллюстрирующая этот процесс.<br> <img src="/pictures/it/xml/img1.gif" alt="С чего начать"><br> Рис 1<br> В общем случае, XSL позволяет автору задавать параметры отображения элемента XML, используя любые языки, предназначенные для форматирования - HTML, RTF и т.д. В этом разделе мы будем использовать в качестве такого языка HTML, т.к. документы, созданные при помощи этого языка разметки могут просматриваться любой подходящей программой просмотра Web-страниц<br><br> <h1>Сценарии</h1> Сценарии могут использоваться в документах XSL точно также, как и в HTML. Кроме того, сценарии, содержащиеся внутри XSL-документа и запускаемые броузером в процессе обработки документа могут динамически создавать HTML-документы, извлекая необходимую для этого информацию непосредственно из элементов XSL-документа.<br> Для написания сценариев XSL использует специальный скриптовый язык - ECMAScript. Однако в msxsl для этих целей можно применять Microsoft JavaScript,- язык, который объединил в себе некоторые элементы стандартного JavaScript и ECMAScript.<br><br> <h1>Схемы данных</h1> Схемы данных (Schemas) являются альтернативным способом создания правил построения XML-документов. По сравнению с DTD, схемы обладают более мощными средствами для определения сложных структур данных, обеспечивают более понятный способ описания грамматики языка, способны легко модернизироваться и расширяться. Безусловным достоинством схем является также то, что они позволяют описывать правила для XML- документа средствами самого же XML. <br> Однако это не означает, что схемы могут полностью заменить DTD- описания - этот способ определения грамматики языка используется сейчас практическими всеми верифицирующими анализаторами XML и, более того, сами схемы, как обычные XML- элементы, тоже описываются DTD. Но серьезные возможности нового языка и его относительная простота, безусловно, дают основания утверждать, что будущий стандарт найдет широкое применение в качестве удобного и эффективного средства проверки корректности составления документов. <br> В настоящее время в W3 консорциуме идет работа над первой спецификацией схем данных, рабочий ее вариант сейчас доступен на сервере []. В этом разделе мы рассмотрим основные возможности схем данных, попытаемся использовать их для проверки корректности ранее описываемых XML- документов. <br><br> <h1>Схемы</h1> <li><b>XML Schema and Data Types Preview</b> - http://www.microsoft.com/xml/schema/reference/start.asp</li><br> <li><b>Resource Description Framework <br>(RDF) Schema Specification</b> - http://www.w3.org/TR/WD-rdf-schema/</li><br> <li><b>Schema for Object-Oriented XML (SOX)</b> - http://www.w3.org/TR/NOTE-SOX/</li><br> <li><b>XML Parsers/Processors</b> - http://www.xmlsoftware.com/parsers/</li><br> <li><b>A Lexical Analyzer for HTML and Basic SGML </b> - http://www.w3.org/MarkUp/SGML/sgml-lex/sgml-lex</li><br> <li><b>UNC Sunsite WWW [and FTP] Server, maintained by W3C XML Chair, Jon Bosak </b> - http://sunsite.unc.edu/pub/sun-info/standards/xml/</li><br> <li><b>XML Editors</b> - http://www.xmlsoftware.com/editors/</li><br> <li><b>Applications development models</b> - http://www.xml.com/xml/pub/Applications</li><br> <li><b>XML.com Guide to Authoring Tools</b> - http://www.xml.com/xml/pub/authortools</li><br> <li><b>Tools - XML and SGML tools including parsers</b> - http://www.xml.com/xml/pub/Tools</li><br><br> <h1>Собственный XML Type</h1> XML DB в СУБД Oracle вводит собственный (native - “родной”) XMLType как объектный тип Oracle и новый, определяемый пользователем, тип данных, который позволяет абстрагироваться от используемой модели хранения. Он предлагает вам как CLOB, так и объектно-реляционное представление “разложенного” (по базе данных) XML-документа. Это единственный, совместимый с XML Schema 1.0 тип, который может использовать команды как SQL, так и SQL-XML с расширенной функциональностью, включая использование встроенных в базу данных PL/SQL и Java.<br> Этот тип данных XML предоставляет следующие возможности для управления структурами хранения XML:<br> <li><b>XPath for XML extraction and updating (XPath для XML извлечения и обновления)</b>: Пользователи могут использовать XPath чтобы изменять элементы или атрибуты XML-документов без выборки всего документа. Поддержка XPath предоставляется в форме методов extract() и existsNode() XMLType и выражений Xpath, которые могут быть использованы для навигации по экземпляру XMLType и для поиска по множеству экземпляров XMLType. Oracle также дал расширение SQL (совместимое с появляющимся стандартом SQL-XML), так что пользователи могут специфицировать элементы для запросов (к базе данных) или создавать их через XPath, а затем использовать SQL-операторы с этими элементами.</li> <li><b>Virtual DOM (Виртуальная DOM)</b>: Одной из проблем обработки DOM-моделей заключается в том, что для оперирования с документом весь этот документ должен быть размещен в оперативной памяти как модель объекта, что приводит к увеличению его размеров во много раз. С большими документами это может быть серьезной проблемой. Но XML DB, однако, позволяет пользователям материализовать DOM-модель “на лету” при обработке запросов (виртуальная ("virtual") или ленивая ("lazy") DOM), при этом, чем делая все сразу; деревья данных загружаются по мере того, как они запрашиваются, предварительно загруженные секции документа отбрасываются, если использование оперативной памяти становится чрезмерным. Эта возможность полностью прозрачна.</li> <li><b>XSL Transformations for XMLType (XSL транформация в XMLType )</b>: Виртуальная DOM-модель особенно полезна при выполнении XSL-преобразований. Как только XSLT-процесс затребует DOM-модель из входного XML-потока, многие пользователи сталкиваются с тем, что документ слишком велик, чтобы завершить этот процесс. Используя виртуальную DOM, однако, пользователи могут обрабатывать только те данные, которые им нужны, отсылать их, фильтровать и получать результаты. Вы можете использовать оператор XML Transform() или метод transform() с любым XMLType.</li> <li><b>Schema caching (Кэширование схемы)</b>: XML DB удерживает структурную информацию (такую, как тэги элементов, типы данных и расположение структур хранения) в кэше схемы, чтобы минимизировать время доступа и расходы на память хранения. Этот кэш расположен на уровне процесса, чтобы минимизировать сетевой трафик и тем самым улучшить производительность при сохранении целостности данных.</li> <br>В будущем Oracle предполагает добавить несколько новых возможностей к этому списку, включая дополнительную функциональность базы данных и XML, такие как XQuery, который будет языком специально разработанным для запросов XML-данных в контексте документа, а а не в контексте строк и таблиц SQL. (Прототип языка XQuery доступен для загрузки на OTN.) XQuery подобен SQL в том, что он обладает специфической грамматикой и использует ключевые слова, но в этом случае предикаты и функции базируются на XPath. <table border=1><tr><td></td></tr></table><br> <b>Следующие шаги</b><b></b><br> Посетите и сделайте закладки XML Technology Center сети OTN:<br><br> <a target="_blank" href="http://otn.oracle.com/tech/xml/content.html"><br> http://otn.oracle.com/tech/<br>xml/content.html</a><br> Скачайте Oracle XDK:<br><br> <a target="_blank" href="http://otn.oracle.com/tech/xml/xdk/content.html"><br> http://otn.oracle.com/tech/xml/<br>xdk/content.html</a><br> Прочитайте техническую статью "Oracle XML DB":<br><br> <a target="_blank" href="http://otn.oracle.com/tech/xml/xmldb/pdf/xmldb_92twp.pdf"><br> http://otn.oracle.com/tech/xml/<br>xmldb/pdf/xmldb_92twp.pdf</a><br><br> <h1>Статьи, спецификации, ссылки на ресурсы</h1> <li><b>The SGML/XML Web Page</b> - http://www.oasis-open.org/cover/sgml-xml.html</li><br> <li><b>The SGML/XML Web Page - Extensible Markup Language (XML)</b> - http://www.oasis-open.org/cover/xml.html</li><br> <li><b>The SGML/XML Web Page - Extensible Style Language (XSL</b> - http://www.oasis-open.org/cover/xsl.html</li><br> <li><b>The SGML/XML Web Page - Public SGML/XML Software</b> - http://www.oasis-open.org/cover/publicSW.html</li><br> <li><b>he SGML/XML Web Page - SGML/XML Bibliograph</b> - http://www.oasis-open.org/cover/biblio.html</li><br> <b><br> Чего мы ждем от XMLШелли Пауэрс(Мир ПК 3/1998 г.)<br></b> - http://www.osp.ru/pcworld/1998/03/180.htm</li><br> <li><b>Overview of SGML Resources </b> - http://www.w3.org/MarkUp/SGML/</li><br> <li><b>XML/XSL Resources - from Bryan Van Hook</b> - http://capita.wustl.edu/XMLRes/</li><br> <li><b>XML News and Links</b> - http://www.arbortext.com/News_and_Events/XML_News_and_Links/xml_news_and_links.html</li><br> <li><b>XML Resources</b> - http://www.microsoft.com/xml/xmllinks.asp</li><br> <li><b>SGML Syntax Summary Table of Contents</b> - http://www.sil.org/htbin/sgml-redirect/sgml/sgmlsyn/contents.htm</li><br> <li><b>XML Community </b> - http://www.inso.com/xml/index.htm</li><br><br> <h1>Стилевые таблицы XSL</h1> В предыдущем разделе для вывода элементов XML- документа на экран броузера мы применяли Java Script-сценарии Однако, как уже отмечалось, для этих целей предпочтительней использование специально предназначенного для этого средства - стилевых таблиц XSL(Extensible Stylesheet Language).<br> Стилевыми таблицами (стилевыми листами) принято называть специальные инструкции, управляющие процессом отображения элемента в окне программы-клиента(например, в окне броузера). Предложенные в качестве рекомендация W3C, каскадные стилевые таблицы(CSS- Cascading Style Sheets []) уже больше года используются Web- разработчиками для оформления Web- страниц. Поддержка CSS наиболее известными на сегодняшний день броузерами Netscape Navigator(начиная с версии 4.0) и Microsoft Explorer(начиная с версии 3.0), позволила использовать стилевые таблицы для решения самого широкого спектра задач - от оформления домашней странички до создания крупного корпоративного Web-узла. Слово каскадные в определении CSS означает возможность объединения отдельных элементов форматирования путем вложенных описаний стиля. Например, атрибуты текста, заданные в тэге <body>, будут распространяться на вложенные тэги до тех пор, пока в них не встретятся стилевые описания, отменяющие или дополняющие текущие параметры. Таким образом, использование таблиц CSS в HTML было весьма эффективно - отпадала необходимость явного задания тэгов форматирования для каждого из элементов документа.<br> Являясь очень мощным средством оформления HTML- страниц, CSS- таблицы, тем не менее, не могут применяться в XML-документах, т.к. набор тэгов в этом языке не ограничен и использование статических ссылок на форматируемые объекты документа в этом случае невозможно.<br> Поэтому для форматирования XML- элементов был разработан новый язык разметки, являющийся подмножеством XML, и специально был предназначен для форматирования XML- элементов.<br> Некоторые его отличия от CSS: <br><br> Во-первых, стилевые таблицы XSL позволяют определять оформление элемента в зависимости от его месторасположения внутри документа, т.е. к двум элементам с одинаковым названием могут применяться различные правила форматирования. <br><br> <br> Во-вторых, языком, лежащем в основе XSL, является XML, а это означает, что XSL более гибок, универсален и у разработчиков появляется возможность использования средства для контроля за корректностью составления таких стилевых списков(используя DTD или схемы данных) <br><br> В-третьих, таблицы XSL не являются каскадными, подобно CSS, т.к. чрезвычайно сложно обеспечить "каскадируемость" стилевых описаний, или, другими словами, возможность объединения отдельных элементов форматирования путем вложенных описаний стиля, в ситуации, когда структура выходного документа заранее неизвестна и он создается в процессе самого разбора. Однако в XSL существует возможность задавать правила для стилей, при помощи которых можно изменять свойства стилевого оформления, что позволяет использовать довольно сложные приемы форматирования <br><br> В настоящий момент язык XSL находится на стадии разработки в W3C[3] и в будущем, видимо, станет частью стандарта XML. Это означает, что использование этого механизма является наиболее перспективным способом оформления XML- документов. В текущем рабочем варианте W3C, XSL рассматривается не только как язык разметки, определяющий стилевые таблицы - в него заложены средства, необходимые для выполнения действий по фильтрации информации, выводимой в окно клиента, поиска элементов, сложного поиска, основанного на зависимостях между элементами и т.д. На сегодняшний день единственным броузером, поддерживающим некоторые из этих возможностей, является бэта-версия Internet Explorer 5.0, однако в самом ближайшем будущем, безусловно, XSL будет использоваться также широко, как сегодня стандартные тэги HTML<br><br> В этом разделе мы рассмотрим упрощенную объектную модель XSL- документа, используемую в текущей версии XSL-конвертора Microsoft msxsl, и поэтому информацию, изложенную далее, нельзя считать описанием стандарта языка. Полный рабочий вариант спецификации XSL в последней его редакции доступен на сервере [].<br><br> Все примеры, приводимые далее, могут быть проверены при помощи XSL- конвертора, свободно доступного на странице Mcrosoft [ ]<br><br> <h1>Структура XSL- таблиц</h1> Рассмотрим основные структурные элементы XSL, используемые, в частности, в конверторе <b>msxsl, </b>для создания оформления XML-документов.<br><br> <h1>Свойства и методы документа(объект XML Document)</h1> <table border=1><br> <tr> URL<br> <td>Свойство, доступное для записи и чтения. Задает или возвращает URL обрабатываемого документа. В случае изменения этого свойства текущий документ уничтожается и начинается загрузка нового по указанному URL</td> </tr> <tr> root<br> <td>Возвращает корневой элемент XML- документа</td> </tr> <tr> charset<br> <td>Свойство, доступное для записи и чтения.Возвращает или устанавливает название текущее кодировочной таблицы согласно требованиям ISO.</td> </tr> <tr> version<br> <td>Возвращает номер версии XML</td> </tr> <tr> doctype<br> <td>Возвращает содержимое элемента !DOCTYPE</td> </tr> <tr> createElement()<br> <td>Метод, позволяющий создать новый элемент, который будет добавлен в качестве дочернего для текущего элемента дерева. В качестве первого параметра задается тип элемента, в качестве второго - название элемента <br>xml.createElement(0,"new_element")</td> </tr> <tr> fileSize<br> <td>Возвращает размер XML- документа. Это свойство в C++- версии анализатора еще не реализовано</td> </tr> <tr> fileModifiedDate<br> <td>Возвращает дату последнего изменения XML- документа. Это свойство в C++- версии анализатора еще не реализовано</td> </tr> <tr> fileUpdatedDate<br> <td>Возвращает дату последнего обновления XML- документа. Это свойство в C++- версии анализатора еще не реализовано</td> </tr> <tr> mimeType<br> <td>Возвращает MIME-тип(MIME- Multipurpose Internet Mail Extension, RFC 1341).Это свойство в C++- версии анализатора еще не реализовано</td> </tr> </table><br> Ниже приведен фрагмент JavaScript- сценария, использующего эти методы и свойства для вывода информации о текущем документе:<br> var xmldoc = new ActiveXObject("msxml"); var xmlsrc = "http://localhost/xml/journal.xml"; xmldoc.URL = xmlsrc; function viewProperties(){ this.document.writeln('<center><table width=90% >'); this.document.writeln('<tr>'); this.document.writeln('<td align="center" bgcolor="silver">Document URL</td> <td align="center">'+xmldoc.URL+'</td></tr>'); this.document.writeln('<tr>'); this.document.writeln('<td align="center" bgcolor="silver">Document root</td> <td align="center">'+xmldoc.root+'</td></tr>'); this.document.writeln('<tr>'); this.document.writeln('<td align="center" bgcolor="silver">Document doctype</td> <td align="center">'+xmldoc.doctype+'</td></tr>'); this.document.writeln('<tr>'); this.document.writeln('<td align="center" bgcolor="silver">Document version</td> <td align="center">'+xmldoc.version+'</td></tr>'); this.document.writeln('<tr>'); this.document.writeln('<td align="center" bgcolor="silver">Document charset</td> <td align="center">'+xmldoc.charset+'</td></tr>'); this.document.writeln('</table></center>'); } <br><br> <h1>Свойства и методы элементов документа</h1> <table border=1><br> <tr> type<br> <td>Возвращает тип элемента. Это свойство может быть использовано для того, чтобы разделить имена тэгов и данные, содержащиеся внутри них. В данной версии анализатора определены следующие типы элементов: <br>0 - элемент <br>1 - текст <br>2 - комментарий <br>3 - Document <br>4 - DTD</td> </tr> <tr> tagName<br> <td>Возвращает или устанавливает название тэга(в виде строки с символами, приведенными к верхнему регистру). Названия метатэгов(например, <?xml?>) начинаются с символа ?. Названия тэгов комментариев начинаются с символа !. </td> </tr> <tr> text<br> <td>Возвращает текстовое содержимое элементов и комментариев. </td> </tr> <tr> AddChild()<br> <td>Добавление нового дочернего элемента и всех его потомков в текущую ветвь дерева. В качестве первого параметра этой функции необходимо передать объект типа Element, который затем будет помещен в список дочерних элементов. Также необходимо задать индекс нового элемента в списке и в качестве последнего параметра обязательно передать значение -1. Т.к. в данной модели любой элемент в документе может иметь ссылку только на один родительский элемент, при выполнении данной процедуры у добавляемого объекта старая ссылка на родительский элемент теряется. Используя это свойство, можно перемещать элементы из одного XML- документа в другое, но том случае, если у дочерних ссылок перемещаемого элемента существуют внешние ссылки или сами дочерние элементы ссылаются на внешние возможно возникновение ошибки <br>elem.addChild(elem.children.item().children.item(0),0,-1)</td> </tr> <tr> removeChild()<br> <td>Удаляет дочерний элемент и всех его потомков. Элементы остаются в памяти и могут быть вновь добавлены к дереву при помощи метода addChild(). <br>elem.removeChild(elem.children.item(1))</td> </tr> <tr> parent<br> <td>Возвращает указатель на текущий родительский элемент. Ссылки на родительский элемент имеют все элементы, за исключением корневого. </td> </tr> <tr> GetAttribute()<br> <td>Возвращает значение указанного атрибута в виде текстовой строки. <br>elem.getAttribute("color")</td> </tr> <tr> SetAttribute()<br> <td>Устанавливает указанный атрибут и его значение. Прежнее значение атрибута теряется <br>elem.setAttribute("color","red")</td> </tr> <tr> removeAttribute()<br> <td>Уничтожает указанный атрибут <br>elem.removeAttribute("color")</td> </tr> <tr> children<br> <td>Возвращает ассоциированный список дочерних элементов(коллекцию). Такой список позволяет приложению получать нужные элементы как по названию, так и по порядковому номеру при помощи метода <b>item()</b>. В том случае, если потомков у текущего элемента нет, функция возвратит null</td> </tr> </table><br><br> <h1>Типизация данных</h1> Довольно часто при создании XML- элемента разработчику требуется определить, данные какого типа могут использоваться в качестве его содержимого. Т.е. если мы определяем элемент <last-modified>10.10.98</last-modified>, то хотим быть уверенными, что в документе в этом месте будет находиться строка, представляющая собой дату, а не число или произвольную последовательность символов. Используя типизацию данных, можно создавать элементы, значения которых могут использоваться, например, в качестве параметров SQL- запросов. Программа клиент в этом случае должна знать, к какому типу данных относится текущее значение элемента и в случае соответствия формирует SQL-запрос. <br> Если в качестве программы на стороне клиента используется верифицирующий XML-процессор, то информацию о типе можно передавать при помощи специально созданного для этого атрибута элемента, имеющего соответствующее DTD- определение. В процессе разбора программа-анализатор передаст значение этого атрибута клиентскому приложению, которое сможет использовать эту информацию должным образом. Например, чтобы указать, что содержимое элемента должно быть длинным целым, можно использовать следующее DTD- определение: <br><!ELEMENT counter (PCDATA)> <!ATTLIST counter data_long CDATA #FIXED "LONG"><br> Задав атрибуту значение по умолчанию LONG и определив его как FIXED, мы позволили тем самым программе-клиенту получить необходимую информацию о типе содержимого данного элемента, и теперь она может самостоятельно определить соответствие типа этого содержимого указанному в DTD- определении . <br> Вот пример XML- документа, в котором определяются и используются несколько элементов с различными типами данных: <br><!ELEMENT price (PCDATA)> <!ATTLIST price data_currency CDATA #FIXED "CURRENCY"> <!ELEMENT rooms_num (PCDATA)> <!ATTLIST rooms_num data_byte CDATA #FIXED "BYTE"> <!ELEMENT floor (PCDATA)> <!ATTLIST floor data_byte CDATA #FIXED "INTEGER"> <!ELEMENT living_space (PCDATA)> <!ATTLIST living_space data_float CDATA #FIXED "FLOAT"> <!ELEMENT counter (PCDATA)> <!ATTLIST counter data_long CDATA #FIXED "LONG"> <!ELEMENT is_tel (PCDATA)> <!ATTLIST is_tel data_bool CDATA #FIXED "BOOL"> <!ELEMENT house (rooms_num, floor,living_space, is_tel, counter, price)> <!ATTLIST house id ID #REQUIED> ... <house id="0"> <rooms_num>5</rooms_num> <floor>2</floor> <living_space>32.5</living_space> <is_tel>true</is_tel> <counter>18346</counter> <price>34 р. 28 к.</price> </house> ...<br> Как видно из примера, механизм создания элементов документа при этом нисколько не изменился. Все необходимая для проверки типов данных информация заложена в определения элементов внутри блока DTD. <br> В заключении хотелось бы отметить, что DTD предоставляет нам весьма удобный механизм осуществления контроля за содержимым документа. На сегодняшний день, практически все программы просмотра документов Интернет используют DTD-правила. Однако это далеко не единственный способ проверки корректности документа. В настоящий момент в W3 консорциуме находится на рассмотрении новый стандарт языка описания структуры документов, называемый схемами данных. Следующий раздел посвящен работе с ними. <br> Назад | Содержание | Вперед<br><br> <h1>Типы данных</h1> В разделе, посвященном DTD, мы уже выяснили, для чего программе-клиенту необходима информация о формате данных содержимого элемента. В схемах существует возможность задавать тот или иной тип данных, используя при определении элемента директиву <b><datatype> </b>с указанием конкретного типа: <br><elementType id="counter"> <datatype dt="int"> </elementType><br> В DTD мы должны были создать атрибут с конкретным названием, определяющим операцию назначения формата данных, и значением, определенным как fixed .Использование элемента <datatype> позволяет указывать это автоматически, но для обеспечения программной независимости необходимо сначала договориться об обозначениях типов данных(значения, которые должны передаваться параметру dt элемента dataype), для чего могут использоваться, например, универсальные идентификаторы ресурсов URI. В любом случае, как и прежде, все необходимые действия, связанные с конкретной интерпретацией данных, содержащихся в документе, осуществляются программой-клиентом и определяются логикой его работы. В разделе, посвященном DTD, мы уже рассматривали пример XML- документа, реализующего описанные нами возможности. Вот как выглядел бы этот пример при использовании схем данных: <br><schema id="someschema"> <elementType id="#rooms_num"> <string/> <datatype dt="int"> </schema> <elementType id="#floor"> <string/> <datatype dt="int"> </schema> <elementType id="#living_space"> <string/> <datatype dt="float"> </schema> <elementType id="#is_tel"> <string/> <datatype dt="boolean"> </schema> <elementType id="#counter"> <string/> <datatype dt="float"> </schema> <elementType id="#price"> <string/> <datatype dt="float"> </schema> <elementType id="#comments"> <string/> <datatype dt="string"> </schema> <elementType id="#house"> <element type="#rooms_num" occurs="ONEORMORE"/> <element type="#floor" occurs="ONEORMORE"/> <element type="#living_space" occurs="ONEORMORE"/> <element type="#is_tel" occurs="OPTIONAL"/> <element type="#counter" occurs="ONEORMORE"/> <element type="#price" occurs="ONEORMORE"/> <element type="#comments" occurs="OPTIONAL"/> </elementType> </schema> ... <house id="0"> <rooms_num>5</rooms_num> <floor>2</floor> <living_space>32.5</living_space> <is_tel>true</is_tel> <counter>18346</counter> <price>34.28</price> <comments>С видом на cеверный полюс</comments> </house> ...<br> <br> Подводя итог всему сказанному, необходимо отметить, что процесс развития современных информационных систем настолько динамичен, что временной промежуток между появлением новой технологии и ее практическим использованием в реально действующих приложениях сегодня слишком мал. На смену устаревающему стандарту HTML в самое ближайшее время должен будет прийти новый, более гибкий и универсальный язык описания данных. И тот факт, что XML как язык еще не стандартизирован и некоторые его составляющие до сих пор находятся в стадии разработки, видимо, не является причиной невозможности его использования уже сегодня, для решения конкретных задач в реальных системах. Примером этому может служить возникновение огромного количества языков описания документов, некоторые из которых приведены в Приложении <br><br> В этой статье были рассмотрены лишь самые основные аспекты, касающиеся новой XML- технологии. В будущем, мы, возможно, остановимся несколько подробнее на производных от XML языках описания данных - SMIL, RDF, MathML, механизмах описания пространства имен и рассмотрим некоторые вопросы, касающиеся создания программ-анализаторов для этих языков. <br><br> <h1>Типы электронной корреспонденции</h1> При передаче файла web-сервер посылает не только его имя и содержание. Он также отправляет множество метаданных о файле в заголовке HTTP (см. листинг 1):<br> <b>Листинг 1. Пример метаданных</b><br> HTTP/1.1 200 OK Date: Sun, 23 Jan 2005 18:21:33 GMT Server: Apache/2.0.52 (Unix) mod_ssl/2.0.52 OpenSSL/0.9.7d Last-Modified: Sun, 10 Oct 2004 16:17:21 GMT ETag: "3e06d-16a05-2dbc8640" Accept-Ranges: bytes Content-Length: 92677 Content-Type: application/xhtml+xml<br> Необходимо обратить внимание на заголовок Content-Type в последней строке. Его значение - application/xhtml+xml - это тип электронной корреспонденции (он может сопровождаться информацией о наборе символов документа). Web-браузеры и другие получатели используют эти метаданные для того, чтобы понять, как обрабатывать файл. Например, такие данные позволяют определить, может ли файл быть представлен в своем оригинальном виде или необходимо использовать вспомогательное приложение. Типы электронной корреспонденции используются и в других контекстах, в том числе в электронной почте, а также в некоторых экспериментальных операционных системах, например, BeOS. Linux и другие системы UNIXR также пользуются типами электронной корреспонденции, но делают это несколько по-другому. Они не присваивают файлам напрямую определенные типы электронной корреспонденции, а преобразуют ("мэппируют") расширения файлов в эти типы. Основная область практического использования типов электронной корреспонденции - это интернет. <br> Основной тип содержимого для типичного документа XML - application/xml. Тип text/xml также является зарегистрированным, но он подвергнулся осуждению из-за некоторых неудачных взаимодействий с другими частями протокола HTTP. (Использование text/xml указывает, что документ находится в кодировке ASCII, даже если декларация XML дает другую информацию). Ниже приведены еще несколько основных зарегистрированных типов электронной корреспонденции:<br><li>application/xml-dtd - используется для определения типа документа;</li><br> <li>application/xml-external-parsed-entity - используется для фрагментов документов. </li><br> <br> По существующему соглашению, для более специфических типов форматов XML используется тип application/foo+xml, где foo подразумевает употребление специального словаря XML. Например, application/rdf+xml для RDF, application/xhtml+xml для XHTML, application/svg+xml для SVG и т.д. При этом обычные процессоры XML могут распознать, что документ находится в формате XML, а процессоры для обработки тех или иных специальных форматов способны определить, в каком именно формате он создан. В таблице 2 перечислены некоторые наиболее распространенные типы электронной корреспонденции. <br><br> <b>Таблица 2. Типы электронной корреспонденции XML</b><br><br> <table border=1> <tr> <td><b>Типы корреспонденции</b></td> <td><b>Формат документа</b></td> </tr> <tr> <td>image/svg+xml*</td> <td>Масштабируемая векторная графика</td> </tr> <tr> <td>application/atom+xml*</td> <td>Синдикация атомарных данных</td> </tr> <tr> <td>application/mathml+xml*</td> <td>Математический язык разметки</td> </tr> <tr> <td>application/beep+xml</td> <td>Расширяемый протокол обмена блоков</td> </tr> <tr> <td>application/cpl+xml</td> <td>Язык обработки запросов</td> </tr> <tr> <td>application/soap+xml</td> <td>Сообщение SOAP</td> </tr> <tr> <td>application/epp+xml</td> <td>Расширяемый протокол инициализации</td> </tr> <tr> <td>application/rdf+xml</td> <td>XML-синтаксис описания ресурсов</td> </tr> <tr> <td>application/xhtml+xml</td> <td>Расширяемый язык разметки гипертекста</td> </tr> <tr> <td>application/xop+xml</td> <td>Бинарная оптимизированная организация пакетов XML</td> </tr> <tr> <td>application/xslt+xml*</td> <td>Таблица стилей расширяемого языка преобразования таблиц стилей</td> </tr> <tr> <td>application/xmpp+xml</td> <td>Расширяемый протокол обмена сообщениями и присутствия</td> </tr> <tr> <td>application/voicexml+xml*</td> <td>Голосовой расширяемый язык разметки</td> </tr> </table> * Находится в процессе регистрации<br><br> Невозможно создавать новые типы электронной корреспонденции для каждого вновь появляющегося формата. Новые типы должны публиковаться в виде формальной спецификации (часто это так называемые "Запросы на комментарии" (Request for Comments) Проблемной группы проектирования Internet (Internet Engineering Task Force, сокр. IETF)) и регистрироваться в Агентстве по выделению имен и уникальных параметров протоколов Internet (Internet Assigned Numbers Authority - IANA). Но экспериментальные подтипы могут определяться и без регистрации. Они должны начинаться с символов х-. Например, тип корреспонденции для авторского языка разметки номенклатуры телевизоров, придуманного автором в качестве примера для его книги "Библия XML 1.1" (XML 1.1 Bible), может быть назван application/x-tvml+xml. Тип application указывает процессорам, что данный файл должен обрабатываться не как данные ASCII. Выражение +xml в конце названия подтипа информирует, что это файл XML, х- говорит о том, что это не зарегистрированный тип, а tvml несет информацию о виде данных. <br><br> <h1>Управление данными XML: подходы к определению документов XML</h1> Эллиотт Расти Хэролд (Elliotte Rusty Harold)<br>Перевод: Intersoft Lab <br>Оригинал: Managing XML data: Identify XML documents<br> Название файла XML не обязательно должно иметь расширение .xml. Более того, документ XML даже не всегда может быть файлом. Он может представлять собой запись базы данных, часть файла, транзитный поток байтов в памяти, который даже не записывается на диск, или комбинацию нескольких различных файлов. Но многие документы XML все же хранятся на дисках или других носителях. В таком случае необходимо иметь возможность быстро их различать. В статье представлены наиболее распространенные расширения файлов и типы электронной корреспонденции (MIME media types), используемые в документах XML.<br> Трехбуквенные расширения используются для идентификации типов файлов как минимум с конца 1960-х годов. Некоторые операционные системы используют четыре, две или даже одну букву вместо трех, но общая конструкция не меняется: имя файла - точка - расширение. При перемещении файлов между гетерогенными системами имя и расширение часто оказываются единственными метаданными, которые остаются с ними. <br> Если документы XML хранятся в виде файлов, то лучше использовать стандартные расширения. Это существенно облегчает поиск, распознавание и обработку файлов XML. На сегодня самым распространенным расширением является .xml, но для отдельных подмножеств XML используется и ряд других (табл. 1). <br> <b>Таблица 1. Стандартные расширения файлов XML</b><br> <table border=1><br> <tr> <td><b>Расширение</b></td> <td><b>Значение</b></td> </tr> <tr> <td>.xml</td> <td>Общий документ XML</td> </tr> <tr> <td>.ent</td> <td>Элемент документа, фрагмент документа</td> </tr> <tr> <td>.dtd</td> <td>Определение типа документа</td> </tr> <tr> <td>.rdf</td> <td>XML-синтаксис описания ресурсов </td> </tr> <tr> <td>.atom</td> <td>Обеспечение синдикации атомарных данных</td> </tr> <tr> <td>.owl</td> <td>Язык онтологии web</td> </tr> <tr> <td>.xhtml</td> <td>Расширяемый язык разметки гипертекста </td> </tr> <tr> <td>.xsd</td> <td>Язык схем XML (W3C XML Schema Language)</td> </tr> <tr> <td>.xsl</td> <td>Преобразования расширяемого языка таблиц стилей (Extensible Stylesheet Language, сокр. XSL)</td> </tr> <tr> <td>.fo</td> <td>Форматирование объектов XSL</td> </tr> <tr> <td>.rng</td> <td>Синтаксис RELAX NG XML</td> </tr> <tr> <td>.sch</td> <td>Схема языка Schematron </td> </tr> <tr> <td>.svg</td> <td>Масштабируемая векторная графика</td> </tr> <tr> <td>.rss</td> <td>Простая синдикация (Really Simple Syndication), формат Rich Site Summary или RDF Site Summary</td> </tr> <tr> <td>.plist</td> <td>Формат списка свойств Apple</td> </tr> </table><br> Ресурсы, обслуживаемые web-сервером, не обязательно могут быть файлами. Но если они являются документами XML, то их URL должны обязательно заканчиваться одним из выше названных расширений, соответствующих конкретному типу того или иного ресурса. <br><br> <h1>URI и адреса</h1> Хотя на практике большинство URI являются адресами (URL - Uniform Resource Locators - унифицированные указатели информационных ресурсов), в пространствах имен XML они используются только как идентификаторы. К сожалению, пространства имен не могут идентифицироваться так же, как пакеты Java. Например: com.psol.vocabulary вместо более неопределенного http://psol.com/vocabulary. <br> Поскольку URI являются идентификаторами, адреса могут не работать, т.е. выдавать ошибку 404 - ресурс не найден - при попытке открыть их. Но они выполняют требуемые от них функции. И, вопреки широко распространенному заблуждению, URI пространств имен не указывают на схему XML Консорциума всемирной сети (World Wide Web Consortium - W3C). <br> Во-вторых, поскольку в этом контексте URI являются идентификаторами, приложение должно точно, до буквы, соответствовать их написанию. Было бы ошибкой использовать URI словаря XML для указания, например, на свой сервер. Например, URI для XSL выглядит следующим образом: http://www.w3.org/1999/XSL/Transform. Если пользователь работает в IBM, он не может превратить этот URI в, например, такой: http://www.ibm.com/1999/XSL/Transform. На самом деле изменения URI существующих словарей не допускаются вообще. <br> Когда автор проводил занятия, посвященные XSLT, слушатели часто недоумевали, почему процессор XSLT не работает - на самом деле, причина была только в том, что XSLT URI не был указан с ошибкой.<br> Первый вывод из вышеизложенного материала - необходимо воздерживаться от изменения пространств имен. Включение схемы версии в URI обычно не является хорошей идеей, поскольку это наверняка "сломает" приложения при выполнении обновлений. <br><br> <h1>Встроенные функции XSL</h1> В завершении приведем список внутренних функций, которые можно использовать в JavaScript –сценариях, предназначенных для анализатора <b>msxsl</b>: <table border=1><br> <tr><td><b>Ancestor(elementType, elem)</b></td> <td>Возвращает для текущего элемента ссылку на ближайший родительский элемент заданного типа. Если такого элемента нет или текущий элемент пустой, то возвращает null </td> </tr> <tr><td><b>ChildNumber(elem)</b></td> <td>Возвращает индекс текущего элемента в списке других дочерних элементов данного типа.</td> </tr> <tr><td><b>AncestorChildNumber()</b></td> <td>Возвращает номер ближайшего предка текущего элемента или null, если такового не существует</td> </tr> <tr><td><b>path(xsl)</b></td> <td>Возвращает массив, содержащий "путь" к текущему элементу - в каждую ячейку этого массива помещается цифровое значение, указывающее на количество элементов одинакового типа, находящихся на текущем уровне вложенности. Первым значением этого массива будет представлен корневой элемент, последним - текущий. Размер массива определяет глубину вложенности текущего элемента.</td> </tr> <tr><td><b>HierarchicalNumberRecursive(elementType,elem)</b></td> <td>Метод, похожий на метод path, но возвращает только дочерние элементы </td> </tr> <tr><td><b>FormatNumber(n,format)</b></td> <td>Возвращает строку - символьное представление номера(т.е. "один", "два" и т.д.). Возможно определение следующих форматов: <br>"1" - 0,1,2,.. <br>"01" - 01,02,03,... <br>"a" - a,b,c,..z, aa, ab,..zz <br>"A" - A,..,Z,AA, .. ZZ</td> </tr> <tr><td><b>FormatNumberList(list,format,separator)</b></td> <td>Возвращает строку, представляющую список, элементами которого являются символьные представления чисел</td> </tr> </table><br> Назад | Содержание | Вперед<br><br> <h1>Вычисление выражений</h1> Наиболее простым примером использования сценариев в XSL -документе является вычисление значений параметров описываемых элементов. Для этого надо просто поставить знак равенства в качестве первого символа параметра, что заставит XSL-процессор вычислить значение выражения(синтаксис этого выражения должен отвечать требованиям JavaScript). Например, после разбора этого правила:<br> <rule> <target-element type="header"> <hr width="=100-20+'%'"> <children/> <hr width="80%"> </rule><br> , в выходном документе окажутся следующие инструкции:<br> <hr width=80%> ... <hr width=80%><br> Очень часто в правилах XSL необходимо использовать атрибуты описываемого в них элемента. Для этого мы должны воспользоваться методом getAttribute(), описанным в объектной модели XML (мы рассматриваем объектную модель XML-документов, предложенную Microsoft, список этих функций приведен в конце раздела). Т.к. каждому элементу XSL доступен указатель на соответствующий ему объект, сценарий может обращаться к внутренним функциям и свойствам этих элементов, при помощи которых и осуществляются необходимые действия.<br> В следующем фрагменте XML- документа определяется элемент <article>, в котором атрибут src используется для задания адреса файла, содержащего текст статьи.<br> <articles> <article src="http://server/pages/article.html">Bugs report</article> </articles><br> Для того, чтобы использовать этот атрибут в выходном HTML-документе, необходимо определить следующее правило:<br> <rule> <target-element type="article"> <a href='=getAttribute("src")'> <children/> </a> </rule><br> После обработки этого фрагмента в выходной документ будет помещен элемент:<br> <a href="http://server/pages/article.html">Bugs report</a> <br><br> <h1>Выполнение инструкций</h1> Другим способом помещения в выходной HTML- документ информации, являющейся результатом выполнения каких-либо операций JavaScript – сценариев является использовнаие инструкции <b><eval></b>;:<br> <rule> <element type="articles"> <target-element type="article"> </element> <tr><td><eval>childNumber(this)</eval></td><td> <children/> </td><tr> </rule><br> Метод childNumber в данном случае возвращает текущий номер дочернего элемента.<br><br> <h1>XML-данные, хранимые в XML DB Repositoty</h1> Но можно и приготовить торт, и съесть его, хотя бы до некоторой степени: Вы можете хранить ваш документ как некоторый Native XML Type (см. ниже) в репозитории XML DB (Oracle's XML DB repository), который целиком побайтно сохранит весь документ, а также “разнесет” его в SQL-таблицы. Такой подход предоставляет вам полную достоверность и в то же время позволяет вам выполнять все DML-операции с документом, которые доступны через XML Views. У вас по-прежнему сохраняется детализированное управление данными, и можно создавать множество представлений и документов на основе этих SQL-данных. После регистрации вашей XML-схемы вы запоминаете свои XML-данные в своей базе данных, просто вставляя файл XML-документа с применением SQL, PL/SQL, Java, FTP, HTTP или WebDAV. Выборка XML-данных из базы данных совершается выполнением SQL-запроса или чтением файла одним из стандартных протоколов Internet. Эта функциональность реализована благодаря поддержке встроенной перезаписи запросов (query re-write), которая снимает необходимость в триггерах типа instead-of-triggers.<br> Помимо легкости работы с XML в форме документа (в целом) или (отдельных) данных, вы получите расширение интерфейсов прикладного программирования объектной модели документа (Document Object Model (DOM) APIs) стандарта косорциума W3C при программном доступе. При разборе XML из файла вы можете построить в оперативной памяти представление в виде дерева всего файла для того чтобы манипулировать с ним. (Такой подход используют и другие XML-процессоры, такие как XSLT.) С возможностью “виртуальная DOM-модель” ("virtual DOM") собственного XMLType, описанной ниже, вы строите такое дерево по требованию: не только сохраняя ресурсы при применении интерфейсов DOM (DOM APIs) и XSLT, но в случае больших документов или наборов строк ваше приложение просто работает (а не падает).<br> Применение репозитория XML DB дает немало преимуществ, но это неверно для каждого приложения. Могут быть велики накладные расходы при поддержке отношения между полным документом и его “разложенными” (по таблицам) данными. Однако, основная проблема связана с эволюцией схемы. Так как документ (его структура) определяет процесс запоминания (отображение (mapping), какие данные в какие таблицы), то тогда, когда вы хотите изменить схему документа, этот процесс уже не абстракция, он “тонко” привязан к схеме базы данных, чья структура влияет на него. Это означает, что вы не можете выполнить большинство нетривиальных изменений схемы базы данных или документа, если не выполните экспорт всех данных и затем их импорт в базу данных.<br> Это обстоятельство могло бы быть настоящим ночным кошмаром, если бы вы работали со многими отраслевыми схемами и должны разгружать ваши данные каждый раз, когда они меняются. Если же нет необходимости в побайтной сохранности документа, эти изменения могут быть вынесены из схемы вашей базы данных благодаря использованию модели хранения XMLType View, описанной ранее.<br><br> <h1>XML Web</h1> <li><b>XML.COM</b> - http://www.xml.com</li><br> <li><b>XMLINFO.COM</b> - http://www.xmlinfo.com/</li><br> <li><b>SCHEMA.NET</b> - http://www.schema.net/</li><br> <b><br> Robin Coverґs SGML/XML Pages <br></b> - http://www.oasis-open.org/cover/</li><br> <li><b>Microsoft's XML Web Site</b> - http://www.microsoft.com/xml/</li><br> <li><b>Microsoft's XSL Web Site</b> - http://www.microsoft.com/xml/xsl</li><br> <li><b>ArborText's XML resources page</b> - http://www.arbortext.com/xmlresrc.html</li><br> <li><b>Charles F. Goldfarb's SGML SOURCE HOME PAGE</b> - http://www.sgmlsource.com/</li><br> <li><b>DataChannel XML Resource Center</b> - http://www.datachannel.com/xml_resources/</li><br> <li><b>DEVELOPER.COM - XML Directory</b> - http://www.developer.com/directories/pages/dir.xml.html</li><br> <li><b>POET XML resource library</b> - http://www.poet.com/xml/</li><br><br> <h1>XMLType CLOB</h1> В некотором смысле, использование некоторого XMLType CLOB – это простейший способ хранения XML-файла. При этом документы в формате XML интерпретируются именно как документы. XML-файл сохраняется в структуре внешней памяти как полный текстовый документ (с пробелами (whitespace), комментариями и т.д. в нетронутом виде), при этом он запоминается просто как одна запись (строка символов) в базе данных. Следовательно, файлы любого размера и глубины (уровня вложенности, depth) могут быть сохранены, если они сформированы в формате XML.<br> Однако, хотя вы можете определить типы данных (datatypes) в документе для проверки по схеме (базы данных), этими данными нельзя манипулировать или выбирать их с применением SQL-запросов.<br> Из-за этого ограничения для поиска данных в документе нужно использовать механизм текстового поиска (text search engine), а не SQL-запросы, в которых можно воспользоваться функциональностью query rewrites, функциональными индексами и т.д. Эффективное изменение документа ограничено, так как оно требует выборки всего файла, совершения изменений и замены документа (в базе данных). Если, однако, основным назначением ваших XML-документов заключается инкапсуляция контента в некоторую структуру для преобразования (это прежде всего относится к публикации в Web, управлению контентом, архивированию документов и т.д.) и большинство изменений контента совершаются на уровне документа (в целом), тогда XMLType CLOB – это ваш оптимальный выбор для структур хранения XML-данных. В этих случаях, вряд ли вам нужен SQL-контекст для ваших данных и у вас будет гарантия побайтной сохранности (byte-by-byte fidelity). (См. во врезке примеры таких приложений.)<br><br> <h1>XSL</h1> <li><b>Using XSL and CSS together <br>W3C Note, 11 September 1998</b> - http://www.w3.org/TR/1998/NOTE-XSL-and-CSS-19980911</li><br> <li><b>An Introduction to XSL by Henry S. Thompson HCRC Language Technology Group University of Edinburgh, Oct 27 1997</b> - http://www.ltg.ed.ac.uk/~ht/swindon.html</li><br> <li><b>Understanding XSL <br>by Jay Greenspan28 October 1998</b> - http://www.hotwired.com/webmonkey/98/43/index2a.html</li><br> <li><b>XSL Tutorials by Frank Boumphrey. </b> - http://www.hypermedic.com/style/xsl/</li><br> <li><b>"The MSXSL XSL Processor." Presentation made by Sean McGrath to SGML UK (SGML Users' Group) Tuesday, March 31, 1998.</b> - http://www.sgml.org.uk/slides/xsl95/</li><br><br> <h1>если пользователь знает обо всех </h1> Итак, если пользователь знает обо всех потенциальных опасностях и ошибках, описанных выше, то он может существенно улучшить создаваемые им документы и приложения XML. Более того, это дает возможность свести к минимуму риск несовместимости и заметно упростить поддержку приложений XML. <br><br> <h1>Еще один способ определить, какие </h1> Еще один способ определить, какие файлы представляют собой документы XML, - просто помнить, где они находятся. Но если этот метод подходит для личных приложений пользователя, то в случае других приложений, которым нужен доступ к тем же данным, но которые не знакомы с системой наименования файлов, принятой пользователем, могут возникнуть проблемы. Поэтому, если пользователь следует стандартным соглашениям относительно наименований файлов и типов электронной корреспонденции (или хотя бы не отклоняется от них беспричинно), его документы становятся более доступными для всех. Это также способствует расширению возможностей XML по обмену данными между гетерогенными системами. <br><br> <h1>если пользователь знает обо всех </h1> Итак, если пользователь знает обо всех потенциальных опасностях и ошибках, описанных выше, то он может существенно улучшить создаваемые им документы и приложения XML. Более того, это дает возможность свести к минимуму риск несовместимости и заметно упростить поддержку приложений XML. <br><br> <h1>Еще один способ определить, какие </h1> Еще один способ определить, какие файлы представляют собой документы XML, - просто помнить, где они находятся. Но если этот метод подходит для личных приложений пользователя, то в случае других приложений, которым нужен доступ к тем же данным, но которые не знакомы с системой наименования файлов, принятой пользователем, могут возникнуть проблемы. Поэтому, если пользователь следует стандартным соглашениям относительно наименований файлов и типов электронной корреспонденции (или хотя бы не отклоняется от них беспричинно), его документы становятся более доступными для всех. Это также способствует расширению возможностей XML по обмену данными между гетерогенными системами. <br><br> <h1>Закрытая и открытая модели описания содержимого элемента</h1> Когда мы определяем модель содержимого текущего элемента, список дополнительных допустимых элементов правилами не ограничивается - он может свободно расширяться. Например, для приведенного выше правила, кроме обозначенных элементов <tel>,<url> и <email> вполне могут использоваться дополнительные элементы, неописанные правилами, например, <fax>: <br><contacts> <tel>12-12-12</tel> <fax>21-21-21</fax> <email>info@j.com</email> <url>http://www.j.com</url> </contacts><br> Однако в том случае, если мы хотим ограничить создаваемые нами правила от включения дополнительных элементов, мы должны использовать атрибут content и установить для него специальное значение CLOSED: <br><elementType id="contacts" content="CLOSED"> <element type="#tel"> <element type="#email"> <element type="#url"> </elementType><br> Теперь приведенный фрагмент XML-документа будет считаться некорректным, т.к. параметром content запрещено использование внутри элемента contacts других объектов, кроме указанных в правиле. <br><br>  <br> <a name="48"><h1>  <img src="/8.gif">  Программирование: Языки - Технологии - Разработка</h1> <ul> <li><a href="/599-1/index.htm">Программирование</a><br> <li><a href="/600-1/index.htm">Технологии программирования</a><br> <li><a href="/601-1/index.htm">Разработка программ</a><br> <li><a href="/602-1/index.htm">Работа с данными</a><br> <li><a href="/603-1/index.htm">Методы программирования</a><br> <br> <li><a href="/604-1/index.htm">IDE интерфейс</a><br> <li><a href="/605-1/index.htm">Графический интерфейс</a><br> <li><a href="/606-1/index.htm">Программирование интерфейсов</a><br> <li><a href="/607-1/index.htm">Отладка программ</a><br> <li><a href="/608-1/index.htm">Тестирование программ</a><br> <br> <li><a href="/609-1/index.htm">Программирование на Delphi</a><br> <li><a href="/610-1/index.htm">Программирование в ActionScript</a><br> <li><a href="/611-1/index.htm">Assembler</a><br> <li><a href="/612-1/index.htm">Basic</a><br> <li><a href="/613-1/index.htm">Pascal</a><br> <br> <li><a href="/614-1/index.htm">Perl</a><br> <li><a href="/615-1/index.htm">VBA</a><br> <li><a href="/616-1/index.htm">VRML</a><br> <li><a href="/617-1/index.htm">XML</a><br> <li><a href="/618-1/index.htm">Ada</a><br> <br> <li><a href="/619-1/index.htm">Lisp</a><br> <li><a href="/620-1/index.htm">Python</a><br> <li><a href="/621-1/index.htm">UML</a><br> <li><a href="/622-1/index.htm">Форт</a><br> <li><a href="/623-1/index.htm">Языки программирования</a><br> </ul> <br> <hr> <hr> </div></div> </body></html>