Показаны сообщения с ярлыком xml. Показать все сообщения
Показаны сообщения с ярлыком xml. Показать все сообщения

суббота, 28 августа 2010 г.

XML и ADO.NET – Часть 2

Первые шаги

Разберем теперь более подробно первый пример. Напомним его текст.

<?xml version="1.0" encoding="WINDOWS-1251"?>
<tutorial>
<title>"Заметки об XSL"</title>
<author>Леонов Игорь Васильевич</author>
</tutorial>

Первая строка информирует браузер о том, что файл имеет формат XML. Атрибут version является обязательным. Атрибут encoding не является обязательным, но если у вас в тексте есть русские буквы, то необходимо вставить этот атрибут, в противном случае XML-файл просто не будет обрабатываться, - вы получите сообщение об ошибке.

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

Элементы могут иметь атрибуты, значения которых тоже могут обрабатываться в соответствии с шаблоном.

На верхнем уровне XML-файла всегда находится один элемент. То есть файл вида

<?xml version="1.0" encoding="WINDOWS-1251"?>
<tutorial>
<title>"Заметки об XSL"</title>
<author>Леонов Игорь Васильевич</author>
</tutorial>
<tutorial>
<title>"Введение в CSP"</title>
<author>Леонов Игорь Васильевич</author>
</tutorial>

не будет обрабатываться браузером. Для преобразования в корректный XML-файл нужно добавить теги элемента верхнего уровня, например

<?xml version="1.0" encoding="WINDOWS-1251"?>
<knowledgeDatabase>
<tutorial>
<title>"Заметки об XSL"</title>
<author>Леонов Игорь Васильевич</author>
</tutorial>
<tutorial>
<title>"Введение в CSP"</title>
<author>Леонов Игорь Васильевич</author>
</tutorial>
</knowledgeDatabase>

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

Перейдем теперь к шаблону преобразования - к XSL-файлу. Задача XSL-файла - преобразовать дерево XML-файла в другое дерево, которое, например, будет соответствовать формату HTML и может быть изображено на экране браузера с учетом форматирования, выбора шрифтов и т.п.

Для того, чтобы браузер выполнил необходимое преобразование, нужно в XML-файле указать ссылку на XSL-файл

<?xml version="1.0" encoding="WINDOWS-1251"?>
<?xml-stylesheet type='text/xsl' href='ex01-1.xsl'?>

Рассмотрим теперь текст XSL-файла

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<p><strong><xsl:value-of select="//title""/></strong></p>
<p><xsl:value-of select="//author"/></p>
</xsl:template>
</xsl:stylesheet>

Первая строка файла содержит тег элемента xsl:stylesheet. Атрибуты элемента - номер версии и ссылка на пространство имен. Эти атрибуты элемента xsl:stylesheet являются обязательными. В нашем случае пространство имен - это все имена элементов и их атрибутов, которые могут использоваться в XSL-файле. Для XSL-файлов ссылка на пространство имен является стандартной.

Заметим, что XSL-файл является одной из разновидностей XML-файлов. Он не содержит пользовательских данных, но формат его тот же самый. Файл содержит элемент верхнего уровня xsl:stylesheet, а далее идет дерево правил преобразования.

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

В дальнейшем тексты XML- и XSL-файлов мы будем приводить в черно-белом варианте. Вы всегда сможете открыть реальный файл и посмотреть все в цвете. При необходимости закомментируйте ссылку на XSL-файл. Синтаксис комментария следующий - <!-- Текст комментария -->. В текст комментария нельзя вставлять символы --.

В первом примере мы посмотрели, как с помощью элемента xsl:value-of можно вывести в HTML-формате содержание элемента (текст, заключенный между тегами). Теперь мы посмотрим, как при помощи того же самого элемента можно вывести значение атрибута элемента.

Рассмотрим следующий XML-файл ex02-1.xml

<?xml version="1.0" encoding="WINDOWS-1251"?>
<?xml-stylesheet type='text/xsl' href='ex02-1.xsl'?>
<tutorial>
<dog caption="Собака: " name="Шарик">
<dogInfo weight="18 кг" color="рыжий с черными подпалинами"/>
</dog>
</tutorial>

В этом файле информация хранится не в содержании элементов, а в виде значений атрибутов. Файл ex02-1.xsl имеет вид

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<P><B><xsl:value-of select="//dog/@caption"/></B>
<xsl:value-of select="//dog/@name"/>.
<xsl:value-of select="//dogInfo/@weight"/>, <xsl:value-of select="//dogInfo/@color"/>.</P>
</xsl:template>
</xsl:stylesheet>

Обратите внимание на синтаксис ссылки на атрибут элемента - //dog/@name. Имя элемента и имя атрибута разделены парой символов "/@". В остальном синтаксис тот же самый, что и для ссылки на содержание элемента.

Результат имеет следующий вид:

Собака: Шарик. 18 кг, рыжий с черными подпалинами.

Обратим теперь внимание на следующий момент. В XSL-файле мы никак не использовали элемент tutorial. На самом деле можно было использовать полный путь. Перепишем наш XML-файл, увеличив глубину дерева (ex02-2.xml)

<?xml version="1.0" encoding="WINDOWS-1251"?>
<?xml-stylesheet type='text/xsl' href='ex02-2.xsl'?>
<tutorial>
<enimals>
<dog caption="Собака: " name="Шарик">
<dogInfo weight="18 кг" color="рыжий с черными подпалинами"/>
</dog>
</enimals>
</tutorial>

Файл ex02-2.xsl имеет вид

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<P><B><xsl:value-of select="//enimals/dog/@caption"/></B>
<xsl:value-of select="//enimals/dog/@name"/>.
<xsl:value-of select="//enimals/dog/dogInfo/@weight"/>, <xsl:value-of select="//dogInfo/@color"/>.</P>
</xsl:template>
</xsl:stylesheet>

Результат будет тем же самым.

Собака: Шарик. 18 кг, рыжий с черными подпалинами.

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

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

Вывод результатов запроса

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

Рассмотрим следующий XML-файл - ex03.xml. Текст его приведен ниже.

<?xml version="1.0" encoding="WINDOWS-1251"?>
<tutorial>
<enimals>
  <dogs>
  <dog>
    <dogName>Шарик</dogName>
    <dogWeight caption="кг">18</dogWeight>
    <dogColor>рыжий с черными подпалинами</dogColor>
  </dog>
  <dog>
    <dogName>Тузик</dogName>
    <dogWeight caption="кг">10</dogWeight>
    <dogColor>белый с черными пятнами</dogColor>
  </dog>
  <dog>
    <dogName>Бобик</dogName>
    <dogWeight caption="кг">2</dogWeight>
    <dogColor>бело-серый</dogColor>
  </dog>
  <dog>
    <dogName>Трезор</dogName>
    <dogWeight caption="кг">25</dogWeight>
    <dogColor>черный</dogColor>
  </dog>
  </dogs>
</enimals>
</tutorial>

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

Простая таблица

Первый шаг - это, как всегда, добавление шаблона преобразования. Модифицируем наш файл, добавив в него ссылку на шаблон. В результате получим файл ex03-1.xml.

В этот файл добавлен шаблон преобразования ex03-1.xsl.

Рассмотрим этот шаблон подробнее. Вот его текст.

<?xml version="1.0" encoding="WINDOWS-1251" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<table border="1">
<tr bgcolor="#CCCCCC">
<td align="center"><strong>Кличка</strong></td>
<td align="center"><strong>Вес</strong></td>
<td align="center"><strong>Цвет</strong></td>
</tr>
<xsl:for-each select="tutorial/enimals/dogs/dog">
<tr bgcolor="#F5F5F5">
<td><xsl:value-of select="dogName"/></td>
<td align="right"><xsl:value-of select="dogWeight"/> <xsl:value-of select="dogWeight/@caption"/></td>
<td><xsl:value-of select="dogColor"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

Первая строка - новая для вас в XSL-файле (но не в XML-файлах!). Она говорит о том, что в XSL-файле нужно нормально воспринимать русские буквы. Без этой строки браузер не сможет корректно обработать русский текст в XSL-файле. Следующие две строки шаблона являются уже привычными. Следующие шесть строк - это строка, содержащая заголовки столбцов таблицы. Конструкция для извлечения текста заголовков таблицы вам уже знакома. А вот десятая строка тоже является новой:

<xsl:for-each select="tutorial/enimals/dogs/dog">

Этот элемент шаблона позволяет выбрать и просмотреть все группы информации, полный путь к которым задается списком тегов "tutorial/enimals/dogs/dog". Обратите внимание - путь задается полностью, ни один из тегов опустить нельзя. Далее в ячейки таблицы помещается информация о наших собаках. В отличие от первых примеров путь к соответствующей информации тоже задается полностью. Попробуем, например, разместить информацию о кличке чуть-чуть иначе ex03-2.xml:

<dogName>
<dogNick>Шарик</dogNick>
</dogName>

Если мы в соответствующем XSL-файле поставим ссылку <xsl:value-of select="dogNick"/>, то в соответствующем столбце никакой клички мы не увидим. Ссылка должна быть полной - <xsl:value-of select="dogName/dogNick"/>. Вы можете самостоятельно поэкспериментировать с файлом ex03-2.xsl. Правильный результат приведен ниже.

Кличка

Вес

Цвет

Шарик

18 кг

рыжий с черными подпалинами

Тузик

10 кг

белый с черными пятнами

Бобик

2 кг

бело-серый

Трезор

25 кг

черный

Сортировка

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

<xsl:for-each select="tutorial/enimals/dogs/dog">

атрибут order-by

<xsl:for-each select="tutorial/enimals/dogs/dog" order-by="dogName">

Наша таблица примет вид (ex03-3.xml, ex03-3.xsl).

Кличка

Вес

Цвет

Бобик

2 кг

бело-серый

Трезор

25 кг

черный

Тузик

10 кг

белый с черными пятнами

Шарик

18 кг

рыжий с черными подпалинами

Более интересные результаты мы получим, если попытаемся отсортировать таблицу по столбцу "Вес". Вначале попробуем сделать по аналогии с предыдущим примером - атрибут order-by="dogName" заменим на order-by="dogWeight". Результат приведен ниже  (ex03-4.xml, ex03-4.xsl).

Кличка

Вес

Цвет

Тузик

10 кг

белый с черными пятнами

Шарик

18 кг

рыжий с черными подпалинами

Бобик

2 кг

бело-серый

Трезор

25 кг

черный

Таблица действительно отсортирована по столбцу "вес", но это не числовая, а строковая сортировка! Для того, чтобы браузер воспринял значения как числа, ему необходимо об этом сказать, - вместо order-by="dogWeight" необходимо написать order-by="number(dogWeight)". Теперь мы получили правильный результат (ex03-5.xml, ex03-5.xsl).

Кличка

Вес

Цвет

Бобик

2 кг

бело-серый

Тузик

10 кг

белый с черными пятнами

Шарик

18 кг

рыжий с черными подпалинами

Трезор

25 кг

черный

Приведем теперь пример сортировки по нескольким столбцам. Различные элементы в атрибуте order-by должны разделяться символом ";" -   order-by="number(dogWeight); dogName" (ex03-6.xml, ex03-6.xsl). Таблица приведена ниже.

Кличка

Вес

Цвет

Трезор

10 кг

черный

Тузик

10 кг

белый с черными пятнами

Бобик

18 кг

бело-серый

Шарик

18 кг

рыжий с черными подпалинами

Следующий пример работает только под управлением XML-парсера версии 3. В нем строки сортируются по одному столбцу - по кличке собаки. Этот пример уже приводился выше, однако теперь мы используем новый синтаксис (ex03-7.xml, ex03-7.xsl).

Отметим разницу.

При использовании нового синтаксиса используется ссылка на другое пространство имен

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

Это очень важный момент, и его никогда нельзя упускать из виду.

Кроме того, мы убрали атрибут order-by в элементе xsl:for-each и добавили другой элемент

<xsl:sort order="ascending" select="dogName"/>

Если элемент xsl:sort присутствует в элементе xsl:for-each, то он всегда должен стоять сразу после элемента xsl:for-each. Синтаксис элемента xsl:sort достаточно очевиден. В нем используются два атрибута: атрибут order - способ сортировки (по возрастанию или по убыванию) и атрибут select - имя поля, по которому производится сортировка. Если нам нужно отсортировать по первому элементу, как в данном примере, то вместо "dogName" можно было поставить точку - ".", для других элементов нужно указывать его имя, например "dogColor", если нам нужно отсортировать записи по цвету собаки. На самом деле атрибутов может быть пять - select, lang, data-type, order и case-order, но мы не будем здесь рассматривать все эти атрибуты, поскольку здесь мы не преследуем цель дать полное описание всех элементов, используемых в XSL, и их атрибутов.

Таблица результатов приведена ниже.

Кличка

Вес

Цвет

Бобик

2 кг

бело-серый

Трезор

25 кг

черный

Тузик

10 кг

белый с черными пятнами

Шарик

18 кг

рыжий с черными подпалинами

С использованием нового синтаксиса легко сменить сортировку по возрастанию на сортировку по убыванию (ex03-8.xml, ex03-8.xsl). Этот пример работает только под управлением XML-парсера версии 3.

Разница заключается в одной строке

<xsl:sort order="descending" select="dogName"/>

Мы изменили значение атрибут order - значение ascending заменено на descending.

Таблица результатов приведена ниже.

Кличка

Вес

Цвет

Шарик

18 кг

рыжий с черными подпалинами

Тузик

10 кг

белый с черными пятнами

Трезор

25 кг

черный

Бобик

2 кг

бело-серый

Покажем теперь сортировку по нескольким полям (ex03-9.xml, ex03-9.xsl). Этот пример работает только под управлением XML-парсера версии 3.

В этом примере у нас фигурируют две строки с элементом xsl:sort.

<xsl:sort order="ascending" select="number(dogWeight)" data-type="number"/>
<xsl:sort order="ascending" select="dogName"/>

Строки вначале сортируются по весу собаки, а затем по их кличкам в алфавитном порядке. Обратите внимание - для того, чтобы сортировка выполнялась в числовой последовательности, в элемент xsl:sort мы добавили атрибут data-type. Таблица результатов приведена ниже.

Кличка

Вес

Цвет

Волчонок

3 кг

темно-серый

Трезор

10 кг

черный

Тузик

10 кг

белый с черными пятнами

Бобик

18 кг

бело-серый

Шарик

18 кг

рыжий с черными подпалинами

Заменив значение атрибута order by на descending, мы легко сгруппируем записи о собаках с одинаковым весом так, что клички будут идти в обратном алфавитном порядке. Соответствующий пример вы легко построите сами.

Кличка

Вес

Цвет

Волчонок

3 кг

темно-серый

Тузик

10 кг

белый с черными пятнами

Трезор

10 кг

черный

Шарик

18 кг

рыжий с черными подпалинами

Бобик

18 кг

бело-серый

XML и ADO.NET – Часть 1

В этой статье мы рассмотрим использование XML формата данных в ado.net.

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

Многие специалисты рассматривают XML как новую технологию интеграции программных компонент. Основными преимуществами использования XML являются:

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

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

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

Использование XML в ADO.NET

Роль языка XML

Язык XML в технологии .NET используется повсеместно. В глобальном видении развития приложений в эпоху Internet компания Microsoft также отводит ему особое место. Ниже перечислены некоторые применения языка XML в .NET.

  • Язык XML используется для кодирования запросов к Web-службам и ответов, возвращаемых клиенту.
  • Язык XML может использоваться для моделирования данных в наборах данных, используемых в технологии доступа к данным ADO.NET.
  • Язык XML используется при создании конфигурационных файлов.
  • Для некоторых языков, поддерживаемых платформой .NET, документация на языке XML может быть сгенерирована автоматически.
  • Язык XML — лингва-франка (общепринятый язык) для корпоративных серверов, построенных на платформе .NET.
  • Язык XML используется технологией Web-служб для описания и передачи данных.

Доступ к данным XML

XML имеет много преимуществ при описании данных, которые нужно перемещать между разнородными системами и источниками данных. Поскольку вы можете обеспечить данные XML описанием схемы данных XML, во многих случаях имеет смысл передавать именно такие данные, а не DataSet (Набор данных). Так как данные ХМL являются текстом, они могут проходить через порты брандмауэров, которые обычно открыты, в отличие от протокола распределенной модели компонентных объектов DCOM (Distributed COM — Distributed Component Object Model) или протокола RMI, используемого в JAVA, которые требуют открытия особых портов.
Мы не ставим себе цель обсудить в следующих разделах все детали языка XML. Мы хотим только продемонстрировать, как можно использовать концепции данных, принятые в ХМL и в DataSet (Набор данных).

Схема и данные XML

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

XmlDataDocument

Документы могут содержать в себе результат вычислений, полученный от базы данных. Например, отчет о продажах содержит, кроме данных о продажах, полученных от источника данных, и некоторые пояснения. Для представления данных в виде документа ХМL используется класс XmlDataDocument.
Класс XmlDataDocument является производным от класса XmlDocument, который представляет документы XML в библиотеке классов .Net Xml Framework. Особенно удобным делает класс XmlDataDocument то, что экземпляр этого класса можно получить из объекта DataSet (Набор данных) посредством простой передачи объекта Data-Set (Набор данных) конструктору класса XmlDataDocument в качестве аргумента. XmlDataDocument имеет свойство DataSet (Набор данных), так что вы можете работать с документом XML как с реляционными данными, если это имеет смысл.

DataSet (Набор данных) и XML

Объект DataSet (Набор данных) содержит методы WriteXml и WriteXmlSchema, которые выдают данные и схему данных, хранящихся в наборе данных. Схема XML, возвращаемая объектом DataSet (Набор данных), определяется из самих данных. Пока вы не добавите явным образом в объект DataSet (Набор данных) ограничения, такие, как первичные или внешние ключи, они не будут частью схемы.
Объект DataSet (Набор данных) содержит также и методы, предназначенные для чтения XML: ReadXml и ReadXmlSchema. С помощью ReadXml можно считывать данные и схему в объект DataSet (Набор данных). Когда схема отсутствует, метод попытается извлечь ее изданных. Если же это не удастся, возникнет исключение. ReadXmlSchema считывает схему документа.
При отсутствии в документе XML схемы, DataSet (Набор данных) будет извлекать данные, как если бы они были таблицами, руководствуясь при этом набором правил. Оставшиеся элементы будут считаться столбцами таблиц
Для определения того, будет столбец записываться в документ XML как элемент или как атрибут, используется свойство Col-rr.Kapping объекта DataColamn. Запись столбца как элемента предпочтительней. Элемент, содержащий нескалярные данные, считается таблицей. Атрибуты и скалярные значения являются столбцами. Подробнее эти правила описаны в документации к .NET.

Рассмотрение примеров

Предварительная подготовка

Для того, чтобы работать с данным документом, вам необходимо располагать как минимум браузером Internet Explorer версии 5.0 и выше. При этом будут работать некоторые из приведенных в тексте примеров.

Для того, чтобы у вас работали все примеры, необходимо установить XML-парсер версии 3. Если пример работает только под управлением XML-парсера версии 3, то в каждом случае это оговаривается особо. Отметим, что версии IE вплоть до 5.5 используют более ранние версии парсера, поэтому устанавливать его все равно придется. О более старших версиях IE узнайте самостоятельно.
Дистрибутив  XML-парсера версии 3 можно найти по адресу http://msdn.microsoft.com/XML/XMLDownloads/default.aspx.
После установки парсера вам нужно будет зарегистрировать его в реестре. Для этого в командной строке необходимо выполнить команду: regsvr32 msxml3.dll. Затем необходимо сообщить IE, что вы намерены использовать этот парсер. Для этого нужно запустить утилиту xmlinst. Утилиту xmlinst можно найти по адресу http://msdn.microsoft.com/library/default.asp?url=/downloads/list/xmlgeneral.asp. Вы можете также попробовать найти ответы на вопросы об установке XML-парсера по адресу http://www.netcrucible.com/xslt/msxml-faq.htm.

Введение

Рассмотрим простой пример XML-файла (ex01.xml).

<?xml version="1.0" encoding="WINDOWS-1251"?>
<tutorial>
<title>"Заметки об XSL"</title>
<author>Леонов Игорь Васильевич</author>
</tutorial>

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

Перепишем наш XML-файл в следующем виде (ex01-1.xml).

<?xml version="1.0" encoding="WINDOWS-1251"?>
<?xml-stylesheet type='text/xsl' href='ex01-1.xsl'?>
<tutorial>
<title>"Заметки об XSL"</title>
<author>Леонов Игорь Васильевич</author>
</tutorial>

И создадим XSL-файл ex01-1.xsl. Текст файла приведен ниже.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<p><strong><xsl:value-of select="//title"/></strong></p>
<p><xsl:value-of select="//author"/></p>
</xsl:template>
</xsl:stylesheet>

Если мы теперь откроем файл ex01-1.xsl в браузере Internet Explorer, то мы увидим, что наша задача решена, - на экране осталась только необходимая нам информация, все теги исчезли. Результат, который вы получите на экране браузера, приведен ниже.

"Заметки об XSL"

Леонов Игорь Васильевич

Легко также увидеть, что порядок вывода строк у нас определяется только содержанием шаблона преобразования - XSL-файла. При необходимости шаблон можно легко поменять, абсолютно не меняя наш основной XML-файл.

Перепишем XML-файл. Информационную часть изменять не будем, а шаблон укажем другой ex01-2.xml.

<?xml version="1.0" encoding="WINDOWS-1251"?>
<?xml-stylesheet type='text/xsl' href='ex01-2.xsl'?>
<tutorial>
<title>"Заметки об XSL"</title>
<author>Леонов Игорь Васильевич</author>
</tutorial>

Создадим XSL-файл ex01-2.xsl. Текст файла приведен ниже.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<p><strong><xsl:value-of select="//author"/></strong></p>
<p><xsl:value-of select="//title"/></p>
</xsl:template>
</xsl:stylesheet>

Если мы теперь откроем файл ex01-2.xsl в браузере Internet Explorer, то результат будет другим.

Леонов Игорь Васильевич

"Заметки об XSL"

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

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

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

Есть и еще одно соображение, которое может быть существенным для разработчиков баз данных. Большинство современных СУБД могут форматировать результаты запроса к базе данных в виде XML-файла. То есть при построении интерфейса пользователя в рамках технологии XML и XSL мы добиваемся определенной независимости от поставщика СУБД. В части организации вывода - практически полной независимости. А эта часть весьма велика в большинстве прикладных систем, ориентированных на работу с базами данных. Конечно, помимо вывода есть еще ввод и серверная обработка бизнес-логики, но здесь вам придется искать какие-то иные решения.

Контроль правильности XML-документа

eXtensible Stylesheet Language – язык форматирования XML данных

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

Управлять отображением элементов в окне программы-клиента (например, в окне броузера) можно с помощью специальных инструкций - стилевых таблиц XSL (eXstensible Stylesheet Language). Эти таблицы XSL позволяют определять оформление элемента в зависимости от его месторасположения внутри документа, то есть к двум элементам с одинаковым названием могут применяться различные правила форматирования. Кроме того, языком, лежащим в основе XSL, является XML, а это означает, что таблицы XSL более универсальны, а для контроля корректности составления таких стилевых таблиц можно использовать DTD-описания или схемы данных, рассмотренные ниже.

XSL-процессор комбинирует XML-документ со спецификацией XSL и создает результат, который для браузера будет HTML, но может быть и любого другого выходного типа — например RTD, необработанный текст и т.д.

XML рассматривается как преемник SGML, а этим подразумевается, что XSL тоже много черпает из некоторых спецификаций стилей SGM. Поскольку SGML стал международным стандартом взаимодействия документов, было бы разумно стили, определяющие то, какими должны быть документы, тоже стандартизировать. В результате мы имеем Язык Семантики и Спецификации Документов (Document Style Semantics and Specification Language — DSSSL). Однако, ранее коммерческих приложений с поддержкой DSSSL, не хватало.

Сейчас существует стандарт HTML, называемый Списки Каскадных Стилей (Cascading Style Sheets — CSS). Этот стандарт предусматривает расширенные возможности при переопределении умолчальных представлений HTML-тэгов, но этого иногда недостаточно, например, при переопределении тэгов и для наследования характеристик от главных или равноправных элементов. Этим и многим другим занимается XSL. Фактически, XSL можно рассматривать как комбинацию большинства возможностей DSSL (без увеличения усложненности) с совместимостью и легкостью в использовании CSS. Это — действительно лучшее, что можно было взять из того и другого.

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

Базовой доктриной XSL является то, что разработчик определяет правило для определенного элемента или набора элементов — правило, определяющее, как должен отображаться данный элемент.

По определению W3C XSL состоит из двух частей:

  • XSLT – XSL Transformation. Язык, используемый для трансформирования XML документов. Таким образом, при помощи XSLT мы можем получить разные разрезы данных.
  • Элементы форматирования. К этим элементам относятся все элементы типографического оформления XML данных после обработки их при помощи XSL.

clip_image001

Примеры казающиеся использования XML и XSL будут рассмотрены чуть позже.

Контроль правильности XML-документа

На сегодняшний день существует два способа контроля правильности XML-документа: DTD-определения (Document Type Definition) и схемы данных (Semantic Schema). Если XML-документ создается и пересылается с использованием DTD-описаний или схем (Schemas), то он называется валидным.

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

Поскольку XML-элементы, используемые в одном документе, могут быть взяты из различных XML-схем, то может возникнуть конфликт имен элементов. Пространства имен (name spaces) позволяют решить эту проблему. Пространства имен позволяют различать элементы с одинаковыми именами, но имеющие разное смысловое значение. Однако они не определяют способ обработки таких элементов - этим занимаются XML-анализаторы, обсуждаемые ниже.

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

<tv-program>

  <area>

    <country> Россия </country>

<city> Санкт-Петербург </city>

  </area>

<day date = "25 декабря">

    <channel name = "ОРТ">

      <program>

        <item time = "06.00">Доброе утро</item>

        <item time = "09.00">НОВОСТИ</item>

        <item time = "09.15">Сериал Нежный яд</item>

<item time = "10.15">Поле чудес (повтор)</item>

<item time = "11.15">М. ф.</item>

        <item time = "11.30">Здоровье</item>

        <item time = "12.00">НОВОСТИ</item>

<item time = "12.15">С легким паром!</item>

<item time = "14.20">М. ф.</item>

        <item time = "14.30">Вместе</item>

        <item time = "15.00">НОВОСТИ</item>

<item time = "16.00">Звездный час</item>

<item time = "18.00">НОВОСТИ</item>

        <item time = "19.35">Погода</item>

<item time = "20.45">Спокойной ночи, малыши</item>

<item time = "21.00">ВРЕМЯ</item>

        <item time = "23.45">Взгляд</item>

      </program>

</channel>

  </day>

</tv-program>

XML-схема будет выглядеть таким образом:

<Schema xmlns="urn:schemas-microsoft-com:xml-data"

xmlns:dt="urn:schemas-microsoft-com:datatypes"

name="TV-ProgramSchema">

  <AttributeType name="name" dt:type="string" required="yes"/>

  <AttributeType name="date" dt:type="string" required="yes"/>

  <AttributeType name="time" dt:type="string" required="yes"/>

  <ElementType name="country" content="textOnly"/>

  <ElementType name="city" content="textOnly"/>

  <ElementType name="area" content="eltOnly">

    <element type="country" minOccurs="0" maxOccurs="1"/>

    <element type="city" minOccurs="0" maxOccurs="*"/>

  </ElementType>

  <ElementType name="item" content="mixed">

    <attribute type="time"/>

  </ElementType>

  <ElementType name="program" content="eltOnly">

    <element type="item" minOccurs="0" maxOccurs="*"/>

  </ElementType>

  <ElementType name="channel" content="mixed">

    <attribute type="name"/>

    <element type="program" minOccurs="1" maxOccurs="1"/>

  </ElementType>

  <ElementType name="day" content="mixed">

    <attribute type="date"/>

    <element type="channel" minOccurs="0" maxOccurs="*"/>

  </ElementType>

  <ElementType name="tv-program" content="eltOnly">

    <element type="area" minOccurs="0" maxOccurs="*"/>

    <element type="day" minOccurs="0" maxOccurs="*"/>

</ElementType>

</Schema>

Эта XML-схема должна быть сохранена в файле TV-ProgramSchema.XML. Корневым элементом этого XML-файла является элемент <Schema>, атрибутами которого является название схемы TV-ProgramSchema и ссылка на пространства имен, которые определяют встроенные типы данных, используемые в этой схеме: xmlns="urn:schemas-microsoft-com:xml-data". Атрибуты элементов этой схемы minOccurs и maxOccurs задают соответственно минимально и максимально возможное количество таких элементов в схеме. Например, строчка <element type="item" minOccurs="0" maxOccurs="*"/> означает, что количество элементов типа item (то есть самих телепередач) в схеме может быть от 0 до бесконечности.

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

<tv-program xmlns="x-schema:TV-ProgramSchema.xml">

Теперь корневой элемент <tv-program> этого XML-описания имеет атрибут xmlns="x-schema:TV-ProgramSchema.xml", являющийся ссылкой на используемую XML-схему.

Теперь рассмотрим другой способ контроля правильности XML-документа:

DTD-определения (Document Type Definition):

Декларация типа XML-документа (document type declaration) содержит определение типа документа (document type definition, DTD) или указывает на него. DTD — это специальная грамматика, описывающая синтаксис определенного класса документов; не будем рассматривать правила создания DTD, а приводем только описание деклараций, которые обеспечивают доступ к DTD. Декларация типа документа, как и декларация раздела, может быть внутренней или внешней. Внутренняя декларация имеет вид:

<!DOCTYPE имя [ тело ]>


а внешняя — те же два варианта, что и внешние разделы:



<!DOCTYPE имя SYSTEM URI [ тело ]>


<!DOCTYPE имя PUBLIC строка? URI [ тело ]>


Таким образом, отличие декларации типа документа от декларации раздела состоит только в том, что:




  • она начинается с ключевого слова !DOCTYPE, а не !ENTITY;


  • она может иметь тело, заключенное в квадратные скобки.



Имя такой декларации должно совпадать с именем корневого элемента, который она описывает, а тело должно соответствовать правилам построения DTD. Примеры внешних деклараций:



<!DOCTYPE spec SYSTEM "xml/1998/06/xmlspec-v20.dtd">


<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.0//EN"


  "/XML/1998/06/xmlspec-v20.dtd">


Отметим, что внешняя декларация типа документа может содержать и ссылку на DTD, которая называется внешним подмножеством DTD, и тело, которое описывает дополнения к внешней DTD (оно называется внутренним подмножеством DTD).



Анализ XML-документов


Получение данных из XML-документа, а также проверка корректности XML-документов обеспечивается анализаторами (parsers) XML-документов. Если XML-документ является формально-правильным, то все анализаторы, предназначенные для разбора XML-документов, смогут работать с ним корректно.



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



Если же на вход XML-анализатору подается XML-документ, использующий XML-схему, то он будет разобран, проверен на правильность и соответствие схеме. Например, XML-описание программы телепередач канала РТР, использующее схему TV-ProgramSchema.xml, будет признано формально-правильным и валидным.



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



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



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



В некоторых анализаторах способ представления структуры документа основывается на спецификации DOM (Document Object Model), что позволяет использовать строгую иерархическую модель DOM при создании XML-документов.



Примером XML-анализатора может служить встроенный в Microsoft Internet Explorer версии 5.0 XML-анализатор MSXML. Он позволяет читать данные из XML-файла, обрабатывать их, генерировать дерево элементов, отображать данные с использованием стилевых таблиц XSL, а также, используя DOM, представлять все элементы данных в виде объектов.

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

XML-документ состоит из деклараций, элементов, комментариев, специальных символов и директив.

1. Элементы и атрибуты

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

Элемент состоит из трех частей: начального тега, содержимого и конечного тега. Тег — это текст, заключенный в угловые скобки "<" и ">". Конечный тег имеет то же имя, что начальный тег, но начинается с косой черты "/". Пример XML-элемента:

<author>Сергей Довлатов</author>


Имена элементов зависят от регистра, т. е. <author>, <Author> и <AUTHOR> — это имена различных элементов. Наличие закрывающего тега всегда обязательно. Если тег является пустым, т. е. не имеет содержимого и закрывающего тега, то он имеет специальную форму:



<элемент/>


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



имя_атрибута="значение_атрибута"


Аттрибут обязан иметь значение, которое всегда должно быть заключено в одинарные или двойные кавычки. Имена атрибутов также зависят от регистра. Пример элемента, имеющего атрибут:



<author country="USA">Сергей Довлатов</author>


Элементы должны либо следовать друг за другом, либо быть вложены один в другой:



<books>


  <book isbn="5887821192">


    <title>Часть речи</title>


    <author>Бродский, Иосиф</author>


    <present/>


  </book>


  <book isbn="0345374827">


    <title>Марш одиноких</title>


    <author>Довлатов, Сергей</author>


    <present/>


  </book>


</books>


Здесь элемент books (книги) содержит два вложенных элемента book (книга), которые, в свою очередь, имеют атрибут isbn и содержат три последовательных элемента: title (название), author (автор) и present (есть в наличии), причем последний пуст, т. к. в данном случае соответствует логическому флажку.



Из приведенного описания видно, что синтаксис XML напоминает синтаксис HTML (что естественно, т. к. оба они являются диалектами одного языка SGML), но требования к оформлению правильных XML-документов выше. Еще одним очень важным отличием XML от HTML является то, что содержимое элементов, т. е. все, что содержится между начальным и конечным тегами, считается данными. Это означает, что XML не игнорирует символы пробела и разрыва строк, как это делает HTML.



2. Пролог и директивы


Любой XML-документ состоит из пролога и корневого элемента, например:



<?xml version="1.0"?>


<books>


  <book isbn="0345374827">


    <title>Марш одиноких</title>


    <author>Довлатов, Сергей</author>


    <present/>


  </book>


</books>


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



Стандарт XML резервирует только одну директиву <?xml version="1.0"?>, указывающую на версию языка XML, которой соответствует данный документ (второй версии XML пока нет). В действительности, эта директива несколько богаче и в самом общем виде выглядит так:



<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>


Здесь атрибут encoding задает кодировку символов документа. По умолчанию считается, что XML-документы должны создаваться в формате UTF-8 или UTF-16. Если же используется какая-либо другая кодировка символов, то ее название должно быть указано в данном атрибуте, как показано в примере. Атрибут standalone говорит о том, содержит ли данный документ внешние разделы. Значение yes означает, что таких разделов нет, значение no — что они есть.



В общем случае, пролог может содержать также декларации типа документа.



3. Комментарии


XML-документы могут содержать комментарии, которые игнорируются приложением, обрабатывающим документ. Комментарии строятся по тем же правилам, что и в HTML:




  • начинайте комментарий с символов "<!--",


  • завершайте комментарий символами "-->",


  • не используйте внутри комментария символов "--".



Пример комментариев:



<!-- это комментарий -->


<!-- а вот еще комментарий,


     занимающий более одной строки -->


4. Имена и данные


Все имена элементов, атрибутов и разделов должны начинаться с буквы Unicode и состоять из букв, цифр, символов точки (.), подчеркивания (_) и дефиса (-). Единственное ограничение состоит в том, что они не должны начинаться с комбинации букв xml в любом регистре; подобные имена зарезервированы для будущих расширений языка. Существенно, что стандарт допускает использование в именах не только английских букв, но и любых других, хотя существующие XML-процессоры часто ограничены теми системами кодировок, которые в них заложены создателями. Поэтому мы в своих примерах пишем имена по-английски.



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



5. Специальные символы


Ряд символов в языке XML зарезервирован и должен представляться специальным образом:
































левая угловая скобка ("<")



&lt;



правая угловая скобка (">")



&gt;



амперсант ("&")



&amp;



двойная кавычка (") в значениях атрибутов



&quot;



одинарная кавычка (') в значениях атрибутов



&apos;





При желании можно пользоваться числовой кодировкой символов в стандарте Unicode. При этом символ может быть задан своим десятичным кодом (&#код;) или шестнадцатеричным кодом (&#xкод;). Например &#169; представляет символ авторского права ©, а &#x410; – русскую букву А. Как мы увидим в дальнейшем, XML гораздо богаче, чем HTML, в использовании подобных конструкций, поскольку позволяет осуществлять подстановку в текст документов любых символьных выражений.



6. Секции CDATA


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



<layout>


  <H1>Заголовок</H1>


</layout>


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



<layout>


  <![CDATA[<H1>Заголовок</H1>]]>


</layout>


Как мы видим из этого примера, секция CDATA заключается в ограничители <![CDATA[ и ]]>. Все внутри этой секции считается символьными данными; в частности, секции CDATA не могут вкладываться друг в друга.



Разделы и их декларации



1. Разделы XML-документа


Физически XML-документ может состоять из несколько разделов (entities). При этом корневой элемент документа также является разделом, который называется разделом документа, хотя он никак специально не оформлен. Все разделы имеют содержимое; все они, кроме раздела документа и внешней DTD, имеют имя.



С точки зрения синтаксического разбора документа разделы подразделяются на анализируемые и неанализируемые. Неанализируемый раздел (unparsed entity) — это ресурс, содержимое которого XML-процессор воспринимает как внешние данные без их синтаксического анализа (например, текст, не являющийся XML-документом). Неанализируемые разделы всегда имеют нотацию, указывающую на их формат. Анализируемые разделы (parsed entities) предназначены для текстовой подстановки: всякий раз, когда XML-процессор встречает в документе имя такого раздела, он заменяет его на содержимое этого раздела.



2. Внутренние разделы


Декларации разделов подразделяются на внутренние и внешние. Декларация внутреннего раздела выглядит так:



<!ENTITY имя значение>


Она включает в себя содержимое объекта (параметр значение) и используется для подстановки этого значения вместо имени раздела. Мы можем, например, ввести в пример с книгами атрибут жанр и использовать для задания жанра внутренние разделы:



<!DOCTYPE spec [


  <!ENTITY pr "проза">


  <!ENTITY po "поэзия">


]>


<books>


  <book genre="&po;">


    <title>Часть речи</title>


    <author>Бродский, Иосиф</author>


  </book>


  <book genre="&pr;">


    <title>Марш одиноких</title>


    <author>Довлатов, Сергей</author>


  </book>


</books>


Из этого примера видно, что ссылка на раздел (entity reference) выглядит точно так же, как ссылка на специальный символ, т. е. имеет вид &имя;. На самом деле, специальные символы — это точно такие же ссылки, но соответствующие разделы заданы неявно во внутренней декларации языка XML. Подобные текстовые подстановки удобны для задания сокращений, позволяющих уменьшить объем документа, и для введения обозначений для часто изменяемых полей документа. Так, например, мы можем вынести во внутренний раздел дату очередной ревизии публикации и затем изменять только значение этого раздела.



3. Внешние разделы


Существуют два варианта деклараций внешнего раздела:



<!ENTITY имя SYSTEM URI [NDATA нотация]?>


<!ENTITY имя PUBLIC строка? URI [NDATA нотация]?>


Первый вариант называется системным разделом, второй — публичным разделом. Они оба связывают имя раздела с внешним ресурсом, заданным своим URI, который должен иметь кодированную форму и не содержать закладок. URI внешнего ресурса называется системным идентификатором раздела. Использование внешнего ресурса зависит от нескольких факторов:




  • Если декларация содержит параметр NDATA, задающий нотацию раздела, то раздел является неанализируемым.


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


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



Примеры деклараций внешних ресурсов:



<!-- неанализируемый ресурс: GIF-образ -->


<!ENTITY photo SYSTEM "images/photo.gif" NDATA gif>


<!-- системный анализируемый ресурс -->


<!ENTITY hatch SYSTEM "http://www.textuality.com/boilerplate/hatch.xml">


<!-- публичный анализируемый ресурс -->


<!ENTITY hatch PUBLIC "-//Textuality//TEXT Standard hatch boilerplate//EN"


  "http://www.textuality.com/boilerplate/hatch.xml">


Внешний анализируемый раздел должен начинаться с директивы <?xml …?>, которая может не содержать номера версии, но обязана содержать кодировку символов. Эта директива не входит в состав подставляемого текста.

Основы XML

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

1. XML — это способ записи структурированных данных

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

2. XML немного похож на HTML

Также как и в HTML, в XML используются тэги (слова, заключенные в '<' и '>') и атрибуты (вида имя="значение"). Но если в HTML фиксируется смысловое значение каждого тэга и атрибута и часто то, как текст между ними будет выглядеть в браузере, в XML тэги используются только для логической разметки данных, и их интерпретация оставляется на усмотрение обрабатывающей программы

3. XML — это текст, но он не предназначен для чтения

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

4. XML умышленно многословен

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

5. XML — это семейство технологий

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

6. XML - модульная технология

XML позволяет вам определять новые форматы документов, комбинируя и повторно используя уже созданные. Поскольку два формата, разработанные независимо, могут иметь элементы или атрибуты с одинаковыми именами, при их комбинировании следует соблюдать осторожность (что должно отличать "<p>", обозначающий "paragraph" в одном формате, от "person" в другом?). Для устранения возможной путаницы при одновременном использовании разных форматов XML предоставляет механизм пространств имен. XSL и RDF являются хорошими примерами основанных на XML форматов, использующих пространства имен. XML Schema разработан для отражения подобной поддержки модульности на уровне определения структур XML-документа, облегчая процесс построения новой схемы на основе существующих.

7. Технология XML свободна от лицензирования, платформо-независима и хорошо поддерживаема

Выбирая XML в качестве основы для своего проекта, вы имеете доступ к большому и все более растущему семейству инструментов (один из которых уже, может, делает то, что вам нужно!) и опыту специалистов, работающих с этой технологией. Выбор XML немного похож на выбор SQL для баз данных: вы все еще должны строить свою базу данных и писать свои программы и процедуры для работы с ней, однако есть много инструментальных средств и людей, способных помочь вам. А так как XML свободен от лицензирования, вы можете строить свое программное обеспечение, не заплатив кому-либо ни копейки. Большая и все более растущая поддержка определяет то, что вы не привязаны к какому-либо конкретному производителю программ. XML — не всегда лучшее решение, но всегда стоит принимать его во внимание.

Что такое XML?

XML (eXtensible Markup Language) - это расширяемый язык разметки, предназначенный для описания в текстовой форме структурированных данных. Этот текстовый (text-based) формат, во многом схожий с HTML, разработан специально для хранения и передачи данных.

XML (eXtensible Markup Language) — это упрощенный диалект языка SGML, предназначенный для описания иерархических структур данных в World Wide Web. Он разрабатывается рабочей группой W3C с 1996 г.; в настоящее время принятой рекомендацией является вторая редакция языка XML 1.0 (октябрь 2000 г.).

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

HTML не выражает смысла документов.

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

HTML громоздок и негибок.

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

Концепция Веб-обозревателя слишком ограничена.

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

Поиск документов возвращает слишком много ссылок.

Все мы постоянно пользуемся поисковыми системами и постоянно клянем их за неудобство работы. Допустим, что мне нужны все тексты книг Сергея Довлатова, имеющиеся в Сети. Попытка поиска по имени автора приведет к тому, что я получу список всех ссылок с этим именем, включая воспоминания о Довлатове, рецензии на его книги и т. д. Намного удобнее было бы воспользоваться специальным тегом <AUTHOR>, чтобы указать, что именно я ищу.

Невозможно найти взаимосвязанные ресурсы.

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

XML — это попытка решить перечисленные проблемы путем создания простого языка разметки, описывающего произвольные структурированные данные. Точнее говоря, это метаязык, на котором пишутся специализированные языки, описывающие данные определенной структуры. Такие языки называются XML-словарями. В отличие от HTML, XML не содержит никаких указаний на то, как описанные в XML-документе данные должны отображаться. Способ отображения данных для различных устройств задается языком описания стилей XSL, который играет для XML примерно ту же роль, что CSS дл HTML. Другое принципиальное его отличие от HTML состоит в том, что XML может содержать любые теги, которые сочтут нужным использовать создатели XML-словаря. Приведем список лишь нескольких специализированных языков на базе XML, которые сегодня находятся в разных стадиях разработки рабочими группами W3C:

  • MathML — язык математических формул;
  • SMIL — язык интеграции и синхронизации мультимедийных средств;
  • SVG — язык двумерной векторной графики;
  • RDF — язык метаописаний ресурсов;
  • XHTML — переформулировка HTML в терминах XML.

Процесс обработки XML-документа состоит в следующем. Его текст анализируется специальной программой, которая называется XML-процессором. XML-процессор ничего не знает о семантике данных в документе; он только производит синтаксический разбор (parsing) текста документа и проверяет его правильность с точки зрени правил XML. Если документ правильно оформлен (well-formed), то результаты разбора текста передаются XML-процессором прикладной программе, которая выполняет их содержательную обработку; если же документ оформлен неверно, т. е. содержит синтаксические ошибки, то XML-процессор должен сообщить о них пользователю.

Итого: XML позволяет описывать и передавать такие структурированные данные, как:

  • отдельные документы
  • метаданные, описывающие содержимое какого-либо узла Internet
  • объекты, содержащие данные и методы работы с ними (например, элементы управления ActiveX или объекты Java)
  • отдельные записи (например, результаты выполнения запросов к базам данных)
  • всевозможные Web-ссылки на информационные и людские ресурсы Internet (адреса электронной почты, гипертекстовые ссылки и пр.)

Применения XML

Возникает вопрос: а какой смысл в использовании "пустого языка", лишенного собственного содержания? Дело в том, что, несмотря на внешнюю простоту, XML обладает достаточно изощренными механизмами контроля правильности данных, позволяет производить проверку иерархических отношений внутри документа, и, самое главное, устанавливает единый стандарт для документов, хранящих данные, какова бы ни была природа этих данных. Остановимся подробнее на некоторых сферах применения языка XML.

Традиционная обработка данных

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

Программирование, управляемое документом

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

Архивирование компонентов

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

Внедрение данных

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

пятница, 27 августа 2010 г.

Роль языка XML

Язык XML в технологии .NET используется повсеместно. В глобальном видении развития приложений в эпоху Internet компания Microsoft также отводит ему особое место. Ниже перечислены некоторые применения языка XML в .NET.

  • Язык XML используется для кодирования запросов к Web-службам и ответов, возвращаемых клиенту.
  • Язык XML может использоваться для моделирования данных в наборах данных, используемых в технологии доступа к данным ADO.NET.
  • Язык XML используется при создании конфигурационных файлов.
  • Для некоторых языков, поддерживаемых платформой .NET, документация на языке XML может быть сгенерирована автоматически.
  • Язык XML — лингва-франка (общепринятый язык) для корпоративных серверов, построенных на платформе .NET.
  • Язык XML используется технологией Web-служб для описания и передачи данных.

Доступ к данным XML

XML имеет много преимуществ при описании данных, которые нужно перемещать между разнородными системами и источниками данных. Поскольку вы можете обеспечить данные XML описанием схемы данных XML, во многих случаях имеет смысл передавать именно такие данные, а не DataSet (Набор данных). Так как данные ХМL являются текстом, они могут проходить через порты брандмауэров, которые обычно открыты, в отличие от протокола распределенной модели компонентных объектов DCOM (Distributed COM — Distributed Component Object Model) или протокола RMI, используемого в JAVA, которые требуют открытия особых портов.
Мы не ставим себе цель обсудить в следующих разделах все детали языка XML. Мы хотим только продемонстрировать, как можно использовать концепции данных, принятые в ХМL и в DataSet (Набор данных).

Схема и данные XML

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

XmlDataDocument

Документы могут содержать в себе результат вычислений, полученный от базы данных. Например, отчет о продажах содержит, кроме данных о продажах, полученных от источника данных, и некоторые пояснения. Для представления данных в виде документа ХМL используется класс XmlDataDocument.
Класс XmlDataDocument является производным от класса XmlDocument, который представляет документы XML в библиотеке классов .Net Xml Framework. Особенно удобным делает класс XmlDataDocument то, что экземпляр этого класса можно получить из объекта DataSet (Набор данных) посредством простой передачи объекта Data-Set (Набор данных) конструктору класса XmlDataDocument в качестве аргумента. XmlDataDocument имеет свойство DataSet (Набор данных), так что вы можете работать с документом XML как с реляционными данными, если это имеет смысл.

DataSet (Набор данных) и XML

Объект DataSet (Набор данных) содержит методы WriteXml и WriteXmlSchema, которые выдают данные и схему данных, хранящихся в наборе данных. Схема XML, возвращаемая объектом DataSet (Набор данных), определяется из самих данных. Пока вы не добавите явным образом в объект DataSet (Набор данных) ограничения, такие, как первичные или внешние ключи, они не будут частью схемы.
Объект DataSet (Набор данных) содержит также и методы, предназначенные для чтения XML: ReadXml и ReadXmlSchema. С помощью ReadXml можно считывать данные и схему в объект DataSet (Набор данных). Когда схема отсутствует, метод попытается извлечь ее изданных. Если же это не удастся, возникнет исключение. ReadXmlSchema считывает схему документа.
При отсутствии в документе XML схемы, DataSet (Набор данных) будет извлекать данные, как если бы они были таблицами, руководствуясь при этом набором правил. Оставшиеся элементы будут считаться столбцами таблиц
Для определения того, будет столбец записываться в документ XML как элемент или как атрибут, используется свойство Col-rr.Kapping объекта DataColamn. Запись столбца как элемента предпочтительней. Элемент, содержащий нескалярные данные, считается таблицей. Атрибуты и скалярные значения являются столбцами. Подробнее эти правила описаны в документации к .NET.

База данных AirlineBrokers

Для рассмотрения доступа к данным XML мы будем использовать базу данных Air-linesBrokers. Указанную базу данных можно создать и инициализировать с помощью SqlServer Query Manager и SQL-скрипта, прилагаемого к примерам для этой главы. База данных AirlinesBrokers имеет функциональные возможности, используемые системой бронирования Acme. С ее помощью клиенты Acme могут бронировать авиабилеты. Такая база данных содержит следующие таблицы:

  • Airlines (Авиалинии): информация об авиалиниях;
  • PlaneType (Тип самолета): типы самолетов, используемые на авиалиниях;
  • Flights (Рейсы): информация о рейсах на различных авиалиниях:
  • Customers (Клиенты): информация о клиентах;
  • Reservations (Резервирование): информация о забронированных клиентами местах.

Хотя в реальной жизни списки клиентов систем AirlinesBroker и HotelBroker (Посредник, бронирующий места в гостинице) вряд ли могут совпасть, в нашем примере мы для простоты будем использовать те же таблицы Customers (Клиенты) и те же компоненты для доступа к данным, ч го и ранее.

DataSet (Набор данных) и XML

Для иллюстрации связи между реляционной моделью объекта DataSet (Набор данных) и моделью ХМ L прежде всего извлечем некоторую информацию из базы данных. В примере DataSetXml для этого используются те же команды и способы, что и ранее в этой главе.
Первым делом создадим соединение, набор данных и преобразователь данных для различных таблиц.

SqlConnect]on *conn =
new SqlConnect K>n ( connectStr ing) ;
DatdSet *d - new Pdtr.Set ( "Ад r±ineBroker") ; // новый Набор данных SqlDjtaAd.-pter "air ] i -n^s Adaptcr =
new Sq]DataAoar te L ; SqiDctaAaapter * f 1 ^qn4- sAdapter -
new SqlLataAdapter; SqlDataAdapter ^plar.etypeAdapter =
new SqlDdtdAdapter; SqlDataAdapter *custon,ersAdaptei =
new SqlDataAaapter; SqlDataAdapter ^reservationsAaapter -
new SqlDataAaapter;

Затем создадим несколько команд select (выбрать) для получения данных, и, используя эти команды, заполним набор данных данными из таблиц.

airlinesAdapter->SelectCommand =
new SqlCommand("select * from Airlines", conn);
// "выбрать * из Авиалиний " airlinesAdapter->Fill(d, "Airlines"); // Заполнить (d, "Авиалинии");
flightsAdapter->SelectCommand =
new SqlCommand("select * from Flights", conn);
// "выбрать * из Рейсов" flightsAdapter->Fill(d, "Flights"); // Заполнить (d, "Рейсы");
planetypeAdapter->SelectCommand =
new SqlCommand("select * from PlaneType", conn); // выбрать planetypeAdapter->Fill(d, "PlaneType"); // Заполнить
customersAdapter->SelectCommand =
new SqlCommand("select * from Customers", conn);
// "выбрать * из Клиентов " customersAdapter->Fill(d, "Customers"); // Заполнить (d, "Клиенты");
reservationsAdapter->SelectCommand =
new SqlCommand("select * from Reservations", conn);
// "выбрать * из Резервирования " reservationsAdapter->Fill(d, "Reservations"); // Заполнить (d, "Резервирование");

Теперь в объекте DataSet (Набор данных) есть данные таблиц Airlines (Авиалинии), PlaneType (Тип Самолета), Flights (Рейсы), Customers (Клиенты) и Reservations (Резервирование). Далее извлечем из данных объекта DataSet (Набор данных) схему XML. Затем извлечем сами данные и запишем их в формате XML.

d->WriteXmlSchema("Airlines.xsd");
d->WriteXml("Airlines.xml");

Приведенные операторы создают два файла: Airlines . xsd и Airlines . xml. Ниже вы видите некоторые данные, записанные в Airlines. xml. Главным элементом является AirlineBroker; именно так назывался объект DataSet (Набор данных). На один уровень ниже находятся элементы, соответствующие разным таблицам объекта DataSet (Набор данных): Airlines (Авиалинии), PlaneType (Тип самолета), Flights (Рейсы) и Customers (Клиенты). О забронированных местах информации в базе данных не было. В получившемся документе каждой строке исходных таблиц соответствует одна запись. Элементы этих записей соответствуют полям исходных таблиц.

<?xml version="l.О" standalone="yes"?> <AirlineBroker> <Airlines>
<Name>America West</Name>
<Abbreviation>AW</Abbreviation>
<WebSite>www.americawest.com</WebSite>
<ReservationNumber>555-555-1212</ReservationNumber> </Airlines> <Airlines>
<Name>Delta</Name>
<Abbreviation>DL</Abbreviation>
<WebSite>www.delta.com</WebSite>
<ReservationNumber>800-456-7890</ReservationNumber>
</Airlines>
<Flights>
<Airline>DIX/Airlj.n£>
<FlightNurrber>98^</FlightNumber>
<StartCity>Atlanta</StartCity>
<EndCity>New Orleans</EndCity>
<Departure>2001-10-05T20:15:00.0000000-04:00 </Departure>
<Amval>2001-10-05T22 : 30: 00. 0000000-04 : 00</Amval>
<PlaneType>737</?ianeType>
<FirstCost>1300</FirstCost>
<BusinessCost>0</BusinessCost>
<EconoiryCost>450</EconomyCost> </Flights>
<PlaneType>
<PlaneType> 737 </PlaneType>
<FirstClass>10</FirstClass>
<BusinessClass>0</BusinessClass>
<EconomyClass>200</EconomyClass> </PlaneType->
<Customers>
<LastName>Adams</LastName> <FirstName>John</FirstName>
<EmailAddress>adams@presidents.org</EmailAddress> <CustomerId>1</CustomerId> </Custorrers> </AirlineBroker>

Вот более русифицированная версия этого XML-документа:

<? xml версия = "1.0" автономный = "да"?> <AirlineBroker> <Авиалинии>
<Название> Американский Запад </Название>
<Сокращение> AW </Сокращение>
<УзелИеЬ> www.americawest.com </УзелМеЬ>
<ReservationNumber> 555-5Ь5-1212 </ReservationNumber> </Авиалинии> <Авиалинии>
<Название> Дельта </Название>
<Сокращение> DL </Сокращение>
<Узeлweb> www.delta.com </УзeлWeb>
<ReservationNumber> 800-456-7890 </ReservationNumber> </Авиалинии> <Рейсы>
<Авиалиния> DL </Авиалиния> <FlightNumber> 987 </FlightNumber> <StartCity> Атланта </StartCity> <EndCity> Новый Орлеан </EndCity> <Вьшет> 2001-10-05Т20:15:00.0000000-04:00
</Вылет> <Прибытие> 2001-10-05Т22:30:00.0000000-04:00 </Прибытие>
<Тип самолета> 737 </Тип самолета> <F.L-(Cust> 1300 </FirstCost> <Bus _ncssCost> 0 </BusinessCost> <EconcmyCost> 450 </EconomyCost> </Рейсь:>
<Тип самолета>
<Тип самолета>737</Тип самолета>
<FirstClass> 10 </FirstClass>
<BusinessClass> 0 </BusinessClass>
<EconomyClass> 200 </EconomyClass> </Тип самолета>
<Клиенты>
<LastName> Адаме </LastName> <FirstName> Джон </FirstName>
<EmailAddress> adams@presidents.org </EmailAddress> <CustomerId> 1 </CustomerId> </Клиенты> </AirlineBroker>

Исходя из этих данных, объект DataSet (Набор данных) создал схему и сохранил ее в файле Airlines.xsd. Дальше мы обсудим некоторые отрывки из этого файла. В нем нет информации о связях или первичных ключах какой бы то ни было таблицы, такой, как Airlines (Авиалинии) или Flights (Рейсы), по той простой причине, что они не были определены в исходной базе данных. Если вы просмотрите созданный файл, вы увидите, что в нем записана и информация о схеме данных таблицы Reservations (Резервирование), несмотря на то, что в этой таблице нет никаких данных.
В первой строке заголовка схемы определено название схемы (AirlineBroker). Кроме того, в нем определены два пространства имен, используемых в этой схеме документа. Одно пространство имен, названное xsd, содержит описание стандарта схемы XML. Второе, названное msdata, содержит описание от Microsoft.

<xsd:schema id="AirlineBroker" targetNamespace="" xmlns="" xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:rnsdata="urn:schemas-microsoft-com:xml-msdata">

В следующей строке описывается элемент под названием AirlineBroker, имеющий атрибут, указывающий, что эта схема получена из объекта DataSet (Набор данных). Это атрибут в определениях Microsoft, а не в пространстве имен W3C Schema. Элемент AirlineBroker относится к составному (не скалярному) типу, т.е. является структурой, состоящей из элементов других типов. Такая структура может содержать произвольное количество элементов (или не содержать ни одного) любого типа, определенного в остальной части схемы.

<xsd:element name="AirlineBroker" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded">

Далее описывается элемент, определяющий тип данных. Этот тип — тоже структура и потому относится к составному (не скалярному) типу, очередность элементов в котором совпадает с очередностью их определения в объекте DataSet (Набор данных). Так уж получилось, что все элементы, соответствующие столбцам таблицы базы данных, определены здесь как имеющие строковый тип string, причем их напичие не считается обязательным. В исходной таблице первичные ключи не определялись, а так как все эти строки в записях базы данных обязательны, объект DataSet (Набор данных) при преобразовании данных вывел и\ из набора таблиц, ограничений и связей, определенных в объекте DataSet (Набор данных) в момент преобразования.

<xsd : element r.ame = "Airlines"> <xsd:conplexType> <xsd:sequence>
<xsd: element narre = "Kame" type="xsd:string"
minOccurs="0" /> <xsd: element narr:e="Abbreviation"
type="xsd:string" minOccurs="0" /> <xsd:element name="KebSite" rype="xsd:string"
minOccurs="0" /> <xsd:element name="ReservationNumber"
type="xsd:string" minOccurs="0" /> </xsd:sequence> </xsd:complexType> </xsd:element>

Таблица Flights (Рейсы) определена аналогичным образом. Кроме того, что в ней не определен первичный ключ, в ней нет и внешних ключей для столбцов Airline (Авиалиния) и Plane Type (Тип самолета).

<xsd: element na.me = "Fliqhts"> <xsd:complexType> <xsd:sequence>
<xsd:element name="Airline" type="xsd:string"
minOccurs="0" /> <xsd:element name="FlightNumber" type="xsd:int"
rainOccurs="0" /> <xsd:element name="StartCity" type="xsd:string"
minOccurs="0" /> <xsd:element name="EndCity" type="xsd:string"
minOccurs="C" /> <xsd:element name="Derarture" type="xsd:dateTime"
minOccurs="0" />
<xsd:element name="Arrival" type="xsd:dateTime"
minOccurs="0" />
<xsd:element name="PlaneType" type="xsd:string"
minOccurs="0" />
<xsd:element name="FirstCost" type="xsd:decimal"
minOccurs="0" /> <xsd:element name="BusinessCost"
type="xsd:decimal" minOccurs="0" /> <xsd:element name="EconomyCost"
type="xsa:decimal" minOccurs="0" /> </xsd:sequence> </xsd: ccm,plexType> </xsd:element>
</xsd:choice>
</xsd:complexType> </xsd:element> </xsd:schema>

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

Создание документа XML из объекта DataSet (Набор данных)

Используя объект DataSet (Набор данных) можно создать новый документ XML. Используя запрос XPath, можно перейти в начало документа, а затем, с помощью объекта XmlNodeReader прочитать весь документ. Мы выведем содержимое документа на экран. Класс XmlNodeReader обеспечивает перемещение по документу. Приведем фрагмент кода из примера DataSetXML:

XmlDataDocument *xmlDataDoc = new XmlDataDocument(d);
XmlNodeReader *xmlNodeReader = 0;
try
{
XmlNode *node = xmlDataDoc->SelectSingleNode("/");
XmlNodeReader = new XmlNodeReader (node);
FormatXml (XmlNodeReader); }
catch (Exception *e) // Исключение {
Console::WriteLine (
"Exception: {0}", e->ToString()); // Исключение
}
finally // наконец
r
if (XmlNodeReader != 0) // если (XmlNodeReader! = 0)
xmlNodeReader->Close(); }
static void FormatXml (XmlReader *reader) {
while (reader->Read()) // читатель-> Чтение () {
switch (reader->NodeType) // переключатель
//(читатель-> NodeType) {
case XmlNodeType::Element: // случай
// XmlNodeType::Элемент Format (reader, "Element"); // Формат (читатель, "Элемент"); while(reader->MoveToNextAttribute() ) Format (reader, "Attribute"); // Формат (читатель, "Атрибут"); break;
case XmlNodeType::Text: // случай XmlNodeType:: Текст Format (reader, "Text"); // Формат (читатель, "Текст"); break;
static String *lastNodeType = ""; // статическая Строка
static void Format(XmlReader *reader, String *nodeType) // Формат
{
if (nodeType->Equals("Element"))
// если (nodeType-> Равняется ("Элемент"))
{
if (lastNodeType->Equals("Element"))
// если (lastNodeType-> Равняется ("Элемент"))
{
Console::WriteLine();
}
for (int i=0; i < reader->Depth; i++)
{
Console::Write(" "); // Запись
}
Console::Write(reader->Name) ;
// Запись:: (читатель-> Название); }
else if (nodeType->Equals("Text")) // если (nodeType-> Равняется ("Текст")) Console::WriteLine("={0}", reader->Value); // Значение else
{
Console::Write(String::Format( // Запись:: (Строка:: Формат ( "{0}<{1}>{2}", nodeType, reader->Name, // Название reader->Value)); // читатель-> Значение Console::WriteLine (); }
lastNodeType = nodeType; }

Вот какой документ XML будет записан объектом DataSet (Набор данных) в файл:

AirlineBroker
Airlines <!— Авиалинии -->
Name=America West
Abbreviation=AW
WebSite=www.americawest.com
ReservationNumber=555-555-1212
Airlines <!-- Авиалинии —>
Name=Delta
Abbreviation=DL
WebSite=www.delta.com
ReservationNumber=800-456-7890
Airlines <!-- Авиалинии -->
Name=Northwest
Abbreviation=NW
WebSite=www.northwest.com
ReservationNumber=888-111-2222
Airlines <!— Авиалинии —>
Name=Piedmont
Abbreviation=P
WebSite=www.piedmont.com
ReservationNumber=888-222-333
Airlines <!-- Авиалинии -->
Name=Southwest
Abbreviation's
WebSite=www.southwest.com
ReservationNumber=l-800-111-222
Airlines <!-- Авиалк-^'и -->
Name=Unitea
Abbreviation=UAL
WebSite=www.ual.com
ReservationNumber=800-123-4568
Flights <'-- Рейсъ. -->
Airline=DL
FlightNumber=987
StartCity=Atlanta
EndCity=New Orleans
Departure=2001-10-05T2G:15:СС.ООСГПСО-04:00
Arnval=2001-10-05T22:30:ОС.ОЭООССО-04:СО
PlaneType=737
FirstCost=1300
BusinessCost=0
EconomyCost=450
Flights <!-- Рейсы -->
Airline=UAL
FlightNumber=54
StartCity=Boston
EndCity=Los Angeles
Departure=2001-10-01T10:00:OO.OOCOOOO-r4:00
Arriva1=2001-10-01T13:00:00.0000000-04:00
PlaneType=767
FirstCost=1500
BusinessCost=1000
EconomyCost=300
PlaneType
PlaneType=737
FirstClass=10
BusinessCldss=0
EconomyСlass=200
PlaneType
PlaneType=767
FirstClass=10
BusinessClass=30
EconomyCiass=300
Customers !'-- 1лкеггы -->
LastName=Adams
FirstName=John
EmailAddress=adans@presidents.erg
Customerld

Резюме

ADO.NET содержит классы, позвопяющие создавать и использовать распределенные данные Вы можете работать с базами данных в соединенном или отсоединенном режимах, в зависимости от потребностей Объект Dt,L_Set (Набор данных) дает возможность работать с данными реляционным способом даже при отсутствии соединения с каким-либо источником данных Для модетирования реляционных данных можно использовать документы XML, содержащие информацию в нереляционном виде Типизированный DataSet (Набор данных) облегчает работу, обеспечивая определение схемы XML для данных