Указания к ЛабРаботам Oldx

advertisement
Министерство образования и науки Российской Федерации
Томский политехнический университет
ЯЗЫКИ ОПИСАНИЯ ИНФОРМАЦИИ
Методические указания к лабораторным работам
для студентов 1 курса магистратуры «Информатика и вычислительная техника»
Томск 2013
Составитель:
Рецензент:
Работа подготовлена на кафедре Оптимизации систем управления
Оглавление
СОДЕРЖАНИЕ ..................................................... Error! Bookmark not defined.
ВВОДНЫЕ ЗАМЕЧАНИЯ ..................................................................................... 6
ЛАБОРАТОРНАЯ РАБОТА №1 ........................................................................... 7
1. Методические указания .................................................................................. 7
Описание структуры документа средствами DTD .................................... 10
Описание схемы документа на языке XSD ................................................ 12
2. Порядок выполнения лабораторной работы .............................................. 14
3. Варианты заданий ......................................................................................... 15
4. Контрольные вопросы .................................................................................. 16
ЛАБОРАТОРНАЯ РАБОТА №2 ......................................................................... 17
1. Методические указания ................................................................................ 17
Каскадные таблицы стилей .......................................................................... 17
Язык XSL ....................................................................................................... 21
2. Порядок выполнения лабораторной работы .............................................. 29
3. Контрольные вопросы .................................................................................. 29
ЛАБОРАТОРНАЯ РАБОТА №3 ......................................................................... 31
2. Порядок выполнения лабораторной работы .............................................. 34
3. Контрольные вопросы .................................................................................. 35
ЛАБОРАТОРНАЯ РАБОТА №4 ......................................................................... 36
2. Порядок выполнения лабораторной работы .............................................. 39
3. Контрольные вопросы .................................................................................. 39
ЛАБОРАТОРНАЯ РАБОТА №5 ......................................................................... 40
2. Порядок выполнения лабораторной работы .............................................. 43
3. Контрольные вопросы .................................................................................. 45
ЛАБОРАТОРНАЯ РАБОТА №6 ......................................................................... 46
2. Порядок выполнения лабораторной работы .............................................. 48
3. Контрольные вопросы .................................................................................. 49
ЛАБОРАТОРНАЯ РАБОТА №7 ......................................................................... 50
1. Методические указания ................................................................................ 50
2. Порядок выполнения лабораторной работы .............................................. 54
3. Контрольные вопросы .................................................................................. 56
ЛАБОРАТОРНАЯ РАБОТА № 8 ........................................................................ 57
1. Методические указания ................................................................................ 57
XML-ДОКУМЕНТ В КАЧЕСТВЕ ИСТОЧНИКА ДАННЫХ ...................... 58
2. Перечень вопросов к разработке ................................................................. 60
3. Контрольные вопросы .................................................................................. 61
СПИСОК ЛИТЕРАТУРЫ..................................................................................... 62
Вводные замечания ........................................................................................... 4
Лабораторная работа №1 ............................................................................. 5
1. Методические указания .............................................................................. 5
2. Перечень вопросов к разработке................................................................ 11
3. Варианты заданий ...................................................................................... 12
4. Контрольные вопросы ................................................................................ 13
Лабораторная работа №2 ............................................................................. 14
1. Методические указания................................................................................ 14
2. Перечень вопросов к разработке.................................................................. 25
3. Контрольные вопросы ................................................................................. 25
Лабораторная работа №3 .............................................................................. 26
1. Методические указания................................................................................ 26
2. Перечень вопросов к разработке.................................................................. 29
3. Контрольные вопросы ................................................................................. 30
Лабораторная работа №4 .............................................................................. 31
1. Методические указания................................................................................ 31
2. Перечень вопросов к разработке.................................................................. 33
3. Контрольные вопросы ................................................................................. 34
Лабораторная работа №5 ……………........................................................... 35
1. Методические указания .............................................................................. 35
2. Перечень вопросов к разработке.................................................................. 38
3. Контрольные вопросы ................................................................................. 40
Лабораторная работа №6 ……………........................................................... 41
1. Методические указания................................................................................ 41
2. Перечень вопросов к разработке.................................................................. 43
3. Контрольные вопросы .................................................................................. 44
Лабораторная работа №7 …………............................................................... 45
1. Методические указания................................................................................ 45
2. Перечень вопросов к разработке.................................................................. 49
3. Контрольные вопросы .................................................................................... 51
Лабораторная работа №8 ............................................................................. 52
1. Методические указания............................................................................... 52
2. Перечень вопросов к разработке................................................................. 55
3. Контрольные вопросы ................................................................................ 56
Список литературы ........................................................................................ 57
Вводные замечания
Лабораторный практикум состоит из 8 лабораторных работ, ориентированных на получение навыков создания оформления и обработки XMLдокументов.
Материал к каждой работе разделен на следующий разделы:
 методические указания к лабораторным работам,
 задание к выполнению,
 контрольные вопросы.
Защита работ предполагает демонстрацию выполненного задания и ответы
на контрольные вопросы.
Для проведения лабораторных работ по данному курсу используется
Microsoft Visual Studio .Net.
В результате прохождения данного курса студент должен приобрести следующие знания:
 что такое языки разметки и для чего они используются,
 принципы моделирования данных с использованием XML,
 Web службы. Построение Web служб: SOAP, UDDI, USDL, WSFL.
Концепция .NET .
А также научиться:
 использовать языки разметки,
 разрабатывать, отображать содержимое и извлекать необходимую информацию из XML-документов,
 разрабатывать и в дальнейшем использовать web-сервисы.
Лабораторная работа №1
Правильно оформленный xml-документ
Цель работы: Изучить конструкции языка XML. И показывать их в webбраузере с использованием языка CSS.
1. Методические указания
Любой XML-документ состоит из следующих частей [2-5,7-8]:
• Необязательный пролог.
• Тело документа.
• Необязательный эпилог, следующий за деревом элементов.
Пролог состоит из нескольких частей:
1. Необязательное объявление XML (XML Declaration), которое заключено
между символами <?...?>.
Объявление содержит:
 пометку xml и номер версии (version) спецификации XML;
 указание на кодировку символов (encoding), в которой написан документ (по умолчанию encoding=”UTF-8”);
 параметр standalone, который может принимать значения “yes” или
“no” (по умолчанию standalone=”yes”). Значение “yes” показывает, что
в документе содержатся все требуемые декларации элементов, a “no” –
что нужны внешние определения DTD.
Все это вместе может выглядеть следующим образом:
<?xml version ="1.0" encoding-"windows-1251" standalone="yes"?>
Важно отметить, что в объявлении XML только атрибут version является обязательным, все остальные атрибуты могут быть опущены и, следовательно,
принимать значения по умолчанию. Так же нужно помнить, что все эти атрибуты следует указывать только в приведенном выше порядке.
После объявления могут следовать комментарии, команды обработки, символы пустых пространств.
2. Необязательное объявление типа документа DTD (Document Type
Declaration), которое заключено между символами <!DOCTYPE...> и может
занимать несколько строк.
После объявления типа документа так же могут следовать комментарии, команды обработки и символы пустых пространств.
Тело документа, состоит из одного или нескольких элементов. В правильно оформленном XML-документе элементы формируют простое иерархическое дерево, в котором обязательно присутствует корневой элемент (root
element), в который вложены все остальные элементы документа. Имя корневого элемента считается именем всего документа и указывается во второй
части пролога после слова Doctype. Имена элементов должны быть уникальны в пределах документа, для выполнения этого требования можно воспользоваться пространством имен. В этом случае имя будет назваться расширенным или уточненным, и будет состоять из префикса, двоеточия и непосредственно самого имени тега (локальная часть имени), например:
<ns:city ns:type=”город”>Томск</ns:city>
Все имена тегов и атрибутов, префиксы которых связаны с одним и тем же
идентификатором, образуют одно пространство имен, в котором имена
должны быть уникальны. Пространство имен определяется следующим образом:
<ns:root_element_name xmlns:ns = “http://URI_namespace”>
Атрибут xmlns может появиться в любом элементе XML. Определенный им
префикс можно применять в том элементе, в котором он записан, и во всех
его вложенных элементах. В элементе можно определить несколько пространств имен. Во вложенных элементах пространство имен можно переопределить.
Элемент начинается открывающим тегом, затем идет необязательное
содержимое элемента, после чего записывается закрывающий тег, исключе-
нием являются так называемые пустые элементы, которые могут быть записаны:
<имя_элемента/>.
В качестве содержимого элемента могут выступать:
1. Другие элементы;
2. Символьные данные;
3. Ссылки на символы.
Они используются, чтобы вставить в текст документа некоторый символ, который, например, не присутствует в раскладке клавиатуры либо может
быть неправильно истолкован анализатором. Ссылка на символ начинается
со знака «амперсанта» и заканчивается точкой с запятой:
&# код_символа_в_Unicode;
или
&#xШестнадцатеричный_код_символа;.
4. Ссылки на сущности, которые позволяют включать любые строковые константы в содержание элементов или значение атрибутов.
Ссылки на сущности, как и ссылки на символы, начинаются с амперсанта,
после которого идет имя сущности, и заканчиваются точкой с запятой:
&имя_сущности;.
Ссылки на сущности указывают XML-процессору, что вместо них
нужно подставить строку символов, заранее заданную в определении типа
документа.
5. Комментарии.
Комментарии используются для того, чтобы сделать какой-то фрагмент
"невидимым" для программы-анализатора.
<!--…текст комментария…-->
6. Разделы CDATA.
Они используются для того, чтобы задать область документа, которую
при разборе анализатор будет рассматривать как простой текст, игнорируя
любые инструкции и специальные символы. Программа-анализатор не разбивает секцию CDATA на элементы, а считает ее просто набором символов.
В отличие от комментариев, содержание данной секции не игнорируется, а
передается без изменений на выход программы анализатора, благодаря чему
его можно использовать в приложении. Секция CDATA начинается со строки
<![CDATA[ после которой записывается содержимое секции. Завершается
секция двумя закрывающими квадратными скобками и знаком "больше":
<![CDATA[ содержание секции ]]>
7. Инструкции по обработке.
Инструкции по обработке содержат указания XML-прроцессору, который будет обрабатывать данный XML-документ. Инструкции по обработке
заключаются между символами <? и ?>. Сразу за начальным вопросительным
знаком записывается имя программного модуля, которому предназначена инструкция. Затем через пробел идет сама инструкция, передаваемая программному модулю. Сама инструкция – это обычная строка, которая не
должна содержать набор символов “?>”, означающий конец инструкции.
Открывающие теги либо теги пустых элементов в XML могут содержать атрибуты, представляющие собой пару имя=значение. Атрибуты могут
содержать ссылки на объекты, ссылки на символы, текстовые символы. В отличие от языка HTML, в XML значения атрибутов обязательно надо заключать в апострофы (‘), либо в кавычки (“). Атрибут может быть записан в одном из двух форматов:
имя_атрибута=”значение_атрибута”
или
имя_атрибута= 'значение_атрибута’.
Описание структуры документа с помощью языка DTD
Для связывания декларации DTD с экземпляром документа в версии
XML 1.0 предлагается специальная декларация DOCTYPE [2-5, 7-8].
Можно написать внешнее подмножество деклараций в отдельном файле DTD, включить внутреннее подмножество в тело декларации DOCTYPE
или сделать то и другое. В последнем случае (смешение внутренних и внешних DTD) во внутренних DTD могут быть заданы новые декларации или переписаны те, что содержатся во внешних (по определению спецификации
XML анализаторы сначала читают внутреннее подмножество, и потому содержащиеся там декларации пользуются приоритетом).
Блок внутренней декларации разметки тега DOCTYPE состоит из левой
квадратной скобки, списка деклараций и правой квадратной скобки:
<! DOCTYPE root_element_name […здесь находятся декларации внутреннего подмножества ... ]>
Для внешних DTD декларация DOCTYPE состоит из обычного ключевого слова и имени корневого элемента, за которым следует еще одно ключевое слово SYSTEM либо PUBLIC, обозначающее источник внешнего определения DTD, а за ним – локализация этого определения.
Допустимое в документе XML содержание определяется с помощью
четырех типов декларации разметки в DTD. В таблице 1 показаны связанные
с этими декларациями ключевые слова и их значения. Первые два типа связаны с информацией, которую мы рассчитываем найти в документе XML, –
элементами и атрибутами. Последние два типа используются для поддержки.
Особенно облегчают жизнь разработчика словаря XML сущности. Как правило, они состоят из содержания, которое настолько часто используется в
DTD или документе, что оправдывает создание специальной декларации. Нотации описывают содержание, разработанное не на языке XML. Используются они для того, чтобы объявить конкретный класс данных и связать его с
внешней программой.
Таблица 1.
Конструкция DTD
Значение
ELEMENT
Декларация типа элемента XML
ATTLIST
Декларация атрибутов, которые могут быть назначены
конкретным типам элементов, а также разрешенных
значений этих атрибутов
ENTITY
Декларация повторно используемого содержания
NOTATION
Декларация форматирования для внешнего содержания, которое не должно быть проанализировано
(например, двоичные данные), а также для внешних
приложений, обрабатывающих содержание
Описание схемы документа на языке XSD
Связать XML-документ с его XSD-схемой можно разными способами[2-5,7-8]:
1. подать файлы со схемой на вход анализатора.
2. задать файлы со схемой как свойство анализатора.
3. указать прямо в документе XML.
Рассмотрим 3 способ более подробно.
Если элементы документа не принадлежат никакому пространству
имен и записаны без префикса, то в корневом элементе документа записывается атрибут noNamespaceSchemaLocation, указывающий расположение файла
со схемой в форме URI:
< root_element_name xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:noNamespaceSchemaLocation="file_name.xsd">
В этом случае в схеме не должно быть целевого пространства имен.
Если же элементы документа относятся к некоторому пространству
имен, то применяется атрибут schemaLocation, в котором через пробел перечисляются пространство имен и расположение файла со схемой, описывающей это пространство имен.
Элементы, из которых будет состоять документ XML, объявляются в
схеме компонентом element:
<xsd:element name="имя элемента" tуре="тип элемента"
minOccurs="Haменьшее число появлений элемента в документе"
maxOccurs="наибольшее число появлений" />
Значение по умолчанию необязательных атрибутов minOccurs и maxOccurs
равно 1. Это означает, что если эти атрибуты отсутствуют, то элемент должен появиться в документе XML ровно один раз.
Указание типа элемента в атрибуте type удобно, если это встроенный простой тип или тип, определенный заранее. Тогда в атрибуте type можно записать только имя типа.
Если же тип элемента определяется здесь же, то определение типа элемента лучше вынести:
<xsd:element name=”имя элемента”>
Определение типа элемента
</xsd:element>
Объявление атрибута элемента тоже несложно:
<xsd:attribute name=" имя атрибута" type="тип атрибута" use="обязательность
атрибута" default="значение по умолчанию" />
Необязательный атрибут use принимает три значения:
 optional— описываемый атрибут необязателен (это значение по умолчанию);
 required— описываемый атрибут обязателен;
 prohibited — описываемый атрибут неприменим. Это значение полезно
при определении подтипа, чтобы отменить некоторые атрибуты базового типа.
Определение типа атрибута, это должен быть простой тип, можно вынести в
содержимое элемента attribute:
<xsd:attribute name="имя атрибута">
Тип атрибута
</xsd:attribute>
Простой тип в схемах XML определяется компонентом схемы simpleType,
имеющим вид:
<xsd:simpleType name="имя типа”> Определение типа </xsd:simpleType>
Кроме встроенных типов в схемах XML можно определить новые типы простых элементов. Они вводятся как:
1. сужение (restriction) встроенного или ранее определенного простого
типа;
2. список (list) простых типов;
3. объединение (union) простых типов.
Кроме простых типов есть сложные типы. Тип элемента называется
сложным, если в элемент вложены другие элементы и/или в открывающем
теге элемента есть атрибуты. Сложный тип определяется компонентом
complexType, имеющим вид:
<xsd:complexType name="имя типа" >
Определение типа
</xsd:complexType>
Необязательный атрибут name задает имя типа, а в содержимом компонента
complexType описываются элементы, входящие в сложный тип, и/или атрибу-
ты открывающего тега.
2. Порядок выполнения лабораторной работы
1. Изучить конструкции языка XML, способы описания структуры документа средствами DTD, описания схемы документа на языке XSD.
2. В соответствии с вариантом задания средствами DTD описать структуру документа.
3. Описать схему документа на языке XSD.
4. В соответствии с разработанной схемой написать валидный правильно
оформленный XML-документ.
5. С помощью файла Validity_test.htm проверить XML-документ на валидность.
6. Оформить отчет, включающий постановку задачи, тексты XML, DTD,
XSD документов, демонстрацию работы программ.
7. Защитить лабораторную работу.
3. Варианты заданий
1. Адресная книга. В адресной книге хранятся: имя, отчество, фамилия человека, его адрес проживания, место работы, должность, домашний и рабочие телефоны. Так же у некоторых может иметься фотография. Как домашних, так и рабочих телефонов может быть несколько или не быть вообще. Человек может работать в нескольких разных фирмах. Он может
занимать в одной и той же фирме несколько должностей.
2. Книжный каталог. В книжном каталоге хранятся: название книги, ее авторы, ISBN номер, цена, краткое описание, фотография обложки, количество страниц, год и место издания, язык на котором она написана. У каждой книги может быть несколько авторов. Каждая книга может иметь несколько вариантов различных изданий. Например, одна и та же книга может быть издана на русском и английском языках, или различными изданиями и, следовательно, иметь различные обложки и цену.
3. Аптечная база. В аптечной базе хранятся: наименование товара, количество, краткое описание, дата поступления товара на базу, дата выпуска,
срок хранения, цена, фирма-производитель с указанием контактной информации (телефоны и адрес). Причем информация о фирмепроизводителе товара должна храниться в отдельном файле. Товар с одним и тем же наименованием может поступать на базу в различные периоды времени различными партиями, при этом цена, дата выпуска, фирмапроизводитель так же может поменяться.
4. База студентов. В базе студентов хранятся: ФИО студента, фотография,
факультет, группа, дата поступления, оценки за экзамены с датой их сдачи, ФИО, должностью и кафедрой преподавателя, принявшего экзамен.
Студент может пересдавать экзамен несколько раз разным преподавателям или одному и тому же, но при этом должность преподавателя может к
этому времени измениться. Так же студент может сдавать экзамены преподавателю из другого института: в этом случае кроме ФИО, должности и
кафедры, так же должен храниться и университет, в котором работает
преподаватель и контактная информация (телефон, который может быть
не один).
5. Расписание занятий. Расписание занятий у каждой группы свое. Для
каждого дня недели расписание свое. При этом некоторые дни недели могут быть свободны. Кроме этого расписание на четной и нечетной неделе
может отличаться. В расписании указывается название предмета, тип
(лекция, практика, лабораторные работы), аудитория (корпус и номер), в
которой будет проходить занятие, ссылка на информацию о преподавателе, которая хранится в отдельном файле. В информацию о преподавателе
входит ФИО, должность, кафедра, университет, контактная информация
(телефон рабочий, домашний, E-mail). Необходимо учесть, что рабочий
телефон может быть не один, домашнего телефона может не быть или
быть несколько, e-mail может не быть или быть несколько.
4. Контрольные вопросы
1. Что такое языки разметки? Стилистическая, структурная и семантическая
разметки.
2. История развития языков разметки: SGML, HTML, XML.
3. Структура XML-документа. Правильно оформленные и верные документы.
4. Зачем нужно определение типа документа (DTD). Общие принципы написания определений DTD.
5. Недостатки и особенности определений DTD.
6. Примитивы. Определение. Типы примитивов и их краткая характеристика.
7. Пространство имен.
Лабораторная работа №2
Отображение XML-документа с помощью каскадной таблицы стилей и
языка XSLT
Цель работы: Изучить основы CSS. Научиться отображать XML-документы
с использованием каскадной таблицы стилей. Изучить конструкции языка
XSL.
Научиться отображать XML документы с использованием XSL.
1. Методические указания
Каскадные таблицы стилей
Для того, чтобы сообщить браузеру (в частности, Microsoft Internet
Explorer), как обрабатывать и отображать каждый из созданных вами XMLэлементов, можно воспользоваться таблицей стилей [5-6]. С помощью данного метода вы связываете таблицу стилей с XML-документом. Таблица стилей
представляет собой отдельный файл, содержащий инструкции для форматирования индивидуальных XML-элементов. Вы можете использовать каскадную таблицу стилей (Cascading Style Sheet – CSS), которая также применяется для HTML-страниц.
Можно выделить два основных этапа при использовании таблицы каскадных стилей для отображения XML-документа:
1. Создание файла таблицы стилей.
2. Связывание таблицы стилей с XML-документом.
Таблица стилей состоит из одного или нескольких правил (иногда их
называют набором правил). Правило содержит информацию по отображению
определенного типа элемента в XML-документе. На рисунке 1 представлено
правило для элементов BOOK с указанием его составных частей.
Рис. 1
Селектор представляет собой имя типа элемента, к которому относится
информация по отображению.
За селектором следует блок объявлений, который ограничивается фигурными скобками ({}) и содержит одно или несколько объявлений, разделяемых точкой с запятой. Каждое объявление задает установку определенного
свойства, такого как размер шрифта, который будет использован для отображения элемента. Объявление состоит из свойства, вслед за которым идет
двоеточие, после которого следует значение для данного свойства.
Набор свойств, которые вы присвоили определенному элементу
(например, BOOK), действует на все дочерние элементы, прямо или косвенно
вложенные в него, если только они не переустанавливаются впоследствии
для определенного дочернего элемента.
Следующие свойства, однако, являются исключениями и не наследуются дочерними элементами:
 свойство display;
 свойства, относящиеся к фону (background-color , background-image ,
background-repeat и background-position );
 свойство vertical-align;
 свойства размещения текста.
Можно применить одно правило к нескольким элементам, включив все
имена элементов в селектор и отделив имена запятыми. Например, следующее правило применяется к типам элементов BOOK, TITLE, AUTHOR, BINDING,
PAGES, PRICE:
BOOK, TITLE, AUTHOR, BINDING, PAGES, PRICE
{display:block;
margin-bottom:1em}
В селекторе вы можете предварить имя элемента именами одного или
нескольких элементов-предков (родительский, родительский плюс родительский родителя и т.д.), и правило будет применено только к элементам с этим
именем, которые являются вложенными подобным образом. Селектор, который включает один или несколько элементов-предков, называется контекстуальным (contextual) селектором. Селектор, который не включает имен элементов-предков, называется родовым (generic) селектором.
Если определенное свойство для одного и того же элемента имеет одну
установку в правиле с контекстуальным селектором, и другую установку в
правиле с родовым селектором, установка в правиле с контекстуальным селектором доминирует, поскольку является более конкретизированной.
В XML-документе можно использовать специальный атрибут STYLE
вместо того, чтобы устанавливать одно или несколько определенных свойств
отдельного элемента в таблице стилей. Если значение свойства, установленного с помощью атрибута STYLE, конфликтует со значением свойства, установленного в таблице стилей, установка с помощью атрибута STYLE имеет
приоритет. Таким образом, атрибут STYLE является удобным средством, чтобы переустановить – для определенного элемента – значение свойства, присвоенное для типа элемента в присоединенной таблице стилей.
<TITLE STYLE='font-style:normal; font-size:14pt'>
The Adventures of Huckleberry Finn
</TITLE>
Для валидных документов вам необходимо объявить атрибут STYLE в
DTD перед тем, как вы сможете использовать атрибут. Вы можете сделать
это, например, следующим образом:
<!ATTLIST TITLE STYLE CDATA #IMPLIED>
Можно воспользоваться директивой @import в таблице каскадных стилей, чтобы встроить в нее одну или несколько других таблиц стилей. Возможность импорта отдельных таблиц стилей позволяет хранить правила для
связанных стилей в отдельных файлах, а затем объединять их при создании
документов определенного типа:
@import url(URLТаблСтил);
Директива @import должна располагаться в начале таблицы стилей перед правилами. Можно поместить в начале таблицы стилей несколько директив @import.
Если импортируется одна или несколько таблиц стилей, браузер объединяет правила, содержащиеся в основной и импортируемых таблицах стилей. Однако в случае возникновения конфликта правил основная таблица
стилей (из файла, в который осуществляется импорт) имеет приоритет над
импортируемыми таблицами стилей. Если же вы импортируете несколько
таблиц стилей, правила из таблицы стилей, импортированной последней,
имеют приоритет над правилами из ранее импортированных таблиц стилей.
Чтобы связать таблицу каскадных стилей с XML-документом, вы
должны вставить в документ зарезервированную инструкцию по обработке
xml-stylesheet.
Эта инструкция по обработке имеет следующую обобщенную форму
записи, где CSSFilePath есть путь, задающий местонахождение файла таблицы стилей:
<?xml-stylesheet type="text/css" href=CSSFilePath?>
Возможность присоединять к XML-документу внешнюю таблицу стилей увеличивает гибкость форматирования документа. Можно полностью
изменить вид документа, просто присоединив к нему другую таблицу стилей.
Чтобы сделать это, достаточно всего лишь отредактировать URL в инструкции по обработке xml-stylesheet, не внося никаких других изменений в XMLдокумент.
В XML-документ можно включить несколько таблиц стилей, вставив
для каждой из них инструкцию по обработке xml-stylesheet в начале XMLдокумента.
Если устанавливается связь с несколькими таблицами стилей, webбраузер объединяет правила из различных таблиц. Если отдельные таблицы
стилей содержат конфликтующие правила, правила из последней связываемой с документом таблицы стилей имеют приоритет над правилами, содержащимися в предшествующих таблицах стилей.
Если нужно показать XML-документ в Internet Explorer , то можно создать правило, которое применяется только к первой букве элемента block с
помощью добавления указателя :first-letter к имени элемента в селекторе. Аналогично, вы можете создать правило, которое применимо только к первой
строке элемента block, добавив указатель :first-line к имени элемента в селекторе. Подобные выражения создают так называемый псевдо-элемент – "псевдо" здесь означает, что правило применяется к фрагменту текста, который не
является отдельным элементом.
CSS представляет собой простой язык стилей, который легко запомнить и использовать. Его главное преимущество – простота. Если нужно
только визуализировать документ XML, не выполняя никаких трансформаций, язык CSS подойдет для этого лучше всего. Его основными недостатками
являются отсутствие более сложных моделей визуализации и зависимость от
структуры обрабатываемых документов XML.
Язык XSL
Язык XSL [2-5,7-8] является приложением XML, так что фактически
таблица стилей (т.е. таблица трансформаций) представляет собой документ
XML. В связи с этим документ может начинаться с декларации XML, показывающей анализатору, какой версией языка документ закодирован.
Корневым элементом нашей таблицы стилей является элемент
<xsl:stylesheet>:
<xsl: stylesheet version=="1.0" xmlns:xsl=="http://www.w3.org/1999/XSL/Transform">.
Первым атрибутом этого элемента служит версия XSLT, вторым – атрибут
xmlns:xsl, содержащий пространство имен для рекомендации трансформации
XSL.
Этот атрибут декларирует пространство имен ХSLT. С данным пространством связан префикс xsl, так что корневым элементом фактически является элемент <stylesheet>, но он квалифицирован префиксом пространства
имен xsl:. После объявления пространства имен любой элемент, начинающийся с префикса xsl:, входит в состав словаря XSL.
Элемент <stylesheet> содержит три шаблона, каждый из которых вложен в элемент <template>. В таблице стилей этот элемент фактически называется <xsl:template>, так как мы включили пространство имен. У элемента
<template> есть атрибут match, значением которого является образец (pattern)
в форме выражения XPath. С ним сравнивается узел дерева, к которому применяется шаблон. Прежде всего, процессору XSL надо сообщить желаемую
форму вывода. Узнав ожидаемый формат вывода, процессор начнет исследовать исходный документ с корневого узла.
Прежде чем сделать преобразование дерева документа XML, из него
следует выбрать те узлы, которые подвергнутся тому или иному преобразованию. Их можно выбирать по имени, содержимому, атрибутам и другим
признакам. Условия отбора узлов задаются образцом (pattern), записанным в
виде одного или нескольких выражений языка XPath 2.0. Выражения, содержащиеся в образце, объединяются вертикальной чертой |, означающей, что
выбираемый узел должен удовлетворять хотя бы одному выражению образца. Вместо вертикальной черты можно записывать слово union.
В образце можно записать не всякое выражение XPath, а только путь,
каждый шаг которого определяется осью, причем допускаются только три
оси: child (по умолчанию), // и attribute. Это означает, что, находясь в каком-то
узле, можно "видеть", кроме него самого, только его атрибуты и узлыпотомки. Обратите внимание на то, что явная запись оси descendant-or-self недопустима, применяется только сокращенная запись //. Запись оси attribute::
можно сократить до одной "собачки" @, а текущий узел очень часто обозначается точкой.
Хотя образец и строится как выражение языка XPath, но его цель – не
отобрать последовательность узлов, а проверить соответствие узла данному
образцу. Можно сказать, что некоторый узел Node соответствует некоторому
образцу pattern тогда и только тогда, когда узел Node принадлежит последовательности узлов – результату вычисления выражения //Pattern. Например,
образцу person//street будут соответствовать все узлы из последовательности
//person//street, а именно все узлы street, вложенные в узлы-элементы person
даже через несколько промежуточных узлов.
Надо сразу же отметить, что перечисленные ограничения касаются
только образцов. В других конструкциях языка XSLT можно применять выражения XPath в полном объеме.
Язык XSLT объявляет около полусотни элементов. Из них 17 элементов верхнего уровня, которые могут быть непосредственно вложены в корневой элемент xsl:stylesheet таблицы стилей. Они называются декларациями.
Это элементы xsl:import, xsl:include, xsl:attribute-set, xsl:character-map, xsl:dateformat, xsl:decimalformat, xsl:function, xsl:import-schema, xsl:key, xsl:namespacealias,
xsl:output,
xsl:param,
xsl:preserve-space,
xsl:sort-key,
xsl:strip-space,
xsl:template, xsl:variable.
Более того, все эти элементы, кроме xsl:param и xsl:variable, можно записывать только на верхнем уровне вложенности, непосредственно в корневом
элементе xsl:stylesheet.
Кроме элементов верхнего уровня вложенности, в языке XSLT объявлено более тридцати элементов, которые можно записывать в теле элементов
верхнего уровня. Наиболее часто применяются элементы xsl:apply-templates,
xsl:value-of, xsl:copy-of, xsl:sort, xsl:text.
Из всех элементов XSLT не верхнего уровня вложенности выделяются
инструкции. Не следует путать инструкции XSLT и инструкции по обработке
XML. Формально инструкции XSLT определяются как элементы, которые
можно вставлять в конструктор последовательности. К инструкциям, в частности, относятся элементы, создающие узлы всех семи видов и последова-
тельности узлов. Это элементы xsl:element, xsl:attribute, xsl:text, xsl:comment,
xsl:processing-instruction, xsl:namespace, xsl:result-document, xsl:sequence.
Кроме них, инструкциями считаются элементы xsl:apply-templates, xsl:
value-of, xsl:variable и др., всего более двадцати элементов. К инструкциям от-
носятся как элементы, управляющие выбором правил преобразовании xsl:if,
xsl:for-each, xsl:choose, так и элементы, копирующие узлы xsl:copy, xsl:copy-of.
Все элементы необязательны и могут располагаться в любом порядке,
за одним исключением: декларации xsl:import, если они есть, должны быть записаны первыми.
Рассмотрим некоторые наиболее часто применяемые элементы XSLT.
Декларация xsl:variable
Элемент xsl:variable определяет имя объекта. Оно записывается обязательным атрибутом name. Имя объекта должно быть уточненным именем
XML типа QName. Кроме того, атрибутом select переменной можно задать
сам объект, а атрибутом as определить тип объекта. Например:
<xsl:variable name="var1" select="count(//person)" as="xs:integer" />
Имя var1 будет хранить число элементов person. Объект может быть получен
из содержимого элемента xsl:variable:
<xsl: variable name="var2">10</xsl:variable>
или создан конструктором последовательности:
<xsl:variable name="var3">
<xsl:value-of select="count (//person) " />
<xsl:variable>
Если объект не получен из атрибута select или содержимого элемента
xsl: variable, то по умолчанию имя связывается с пустой строкой.
Для того чтобы получить объект, связанный с именем, определенным
элементом xsl: variable, перед именем надо поставить знак доллара: $varl,
$var2. При этом следует учитывать область действия имени.
Область действия имени простирается на весь элемент, в котором оно
определено, начиная с места определения и включая вложенные элементы,
если только в них не определено то же самое имя.
Имена, определенные непосредственно в корневом элементе
xsl:stylesheet, называются глобальными именами, остальные— локальными
именами.
Хотя слово "variable" и переводится с английского языка как "переменная", имя, созданное элементом xsl: variable, — это не имя переменной, его
значение нельзя изменить. Это только название некоторого объекта, которое
удобно использовать в тех случаях, когда объект надо использовать во многих местах таблицы стилей, а его вычисление сложно или громоздко.
Декларация xsl:param
Элемент xsl:param записывается или непосредственно в элементе
xsl:stylesheet, чтобы задать параметр преобразования, или в элементе
xsl:template, чтобы задать параметр правила, или в элементе xsl:function как
аргумент функции. У него один обязательный атрибут name, определяющий
имя параметра. Кроме него, часто присутствует необязательный атрибут
select, в котором записывается выражение для получения значения параметра:
<xsl:param name="pl" select="10 + 20" />
Если атрибут select отсутствует, то значение параметра берется из содержимого элемента, которым может быть конструктор последовательности
узлов и атомарных значений:
<xsl:param name="p2">10</xsl:param>
Если отсутствует и атрибут select, и содержимое элемента, то параметр
получает значение пустой строки.
Для получения значения параметра надо записывать его имя со знаком
доллара: &p1,&p2. Например:
<xsl:when test= "&p1=10 ">
Правила, определяющие область видимости параметров, такие же, как и у
имен
объектов, определенных декларацией xsl:variable.
Еще один необязательный атрибут as содержит желательный тип, к которому
будет приведено значение параметра.
Наконец, последний атрибут required, принимающий значения yes или nо (по
умолчанию), указывает обязательность параметра. Если параметр обязателен,
required="
yes", то элемент xsl:param должен быть пустым и не содержать атрибут
select. В таком случае он получит определенное значение при вызове функции или
элементом xsl:with-param при вызове шаблона.
Элемент xsl:with-param
Элемент xsl:with-param ссылается на некоторый параметр, имя которого записано в обязательном атрибуте name. Необязательным атрибутом select можно
задать выражение, результат вычисления которого будет новым значением параметра:
<xsl:with-param name="pl" select="100 * 20" />
Новое значение можно задать и в содержимом элемента:
<xsl:with-param name="pl">100</xsl:with-param>
Элемент xsl:with-param используется только в инструкциях xsl:applytemplates,
23
xsl:apply-imports, xsl:call-template.
Инструкция xsl:value-of
Элемент xsl:value-of вычисляет выражение, записанное в его обязательном
ат-
рибуте select, и преобразует его в строку. Например, выше мы определили
имя
объекта var2. Чтобы получить значение объекта var2, надо записать:
<xsl:value-of select="$var2" />
Если в результате вычисления выражения получается последовательность, то
процессор XSLT версии 1.0 выберет из нее только первый элемент, преобразованный в строку.
Инструкции управления xsl:if, xsl:for-each, xsl:choose
Элемент xsl:if запускает конструктор последовательности, содержащийся в
его
теле, только если истинно выражение, записанное в обязательном и единственном
атрибуте test:
<xsl:if test="$x > $у">
<xsl:value-of select="$x"/> больше <xsl:value-of select="$y" />
</xsl:if>
У элемента xsl:for-each в обязательном и единственном атрибуте select записывается выражение, дающее в результате последовательность. Для каждого
члена
этой последовательности выполняется конструктор, содержащийся в теле
элемента xsl:for-each. В результате получается цикл, выполняющийся столько раз, сколько элементов у последовательности, полученной в результате
вычисления выражения атрибута select.
У элемента xsl:choose нет ни одного атрибута, но в его теле записывается
один или несколько элементов xsl: when и один необязательный элемент
xsl:otherwise:
<xsl:choose>
<xsl when test="$day=l">Понедельник</xsl:when>
<xsl when test="$day=2">Bторник</xsl:when>
<xsl when test="$day=3">Cреда</xsl:when>
<xsl when test="$day=4">Четверг</xsl:when>
<xsl when test="$day=5">Пятница</xsl:when>
24
<xsl when test="$day=6">Cy66oтa</xsl:when>
<xsl when test="$day=7">Bocкpeceнье</xsl:when>
<xsl otherwise>Ошибка определения дня нeдeли</xsl:otherwise>
</xsl:choose>
У элемента xsl:when есть только один обязательный параметр test, содержащий логическое выражение, и тело, содержащее конструктор последовательности.
Элемент xsl: otherwise не имеет атрибутов, у него есть только тело, содержащее конструктор последовательности.
В инструкции xsl: choose всегда выполняется не больше одного варианта, Варианты xsl:when просматриваются в порядке их написания в инструкции
xsl:choose. Как только будет найден вариант с истинным значением выражения test, он будет выполнен, и результат этого варианта будет результатом
всей инструкции. Варианты, следующие за ним по порядку, не рассматриваются. Если ни один вариант не подойдет, то результатом инструкции будет
результат конструктора, записанного в элементе xsl:otherwise. Если элемента
xsl:otherwise в инструкции нет, то результатом будет пустая строка.
Инструкция xsl:apply-templates
Элемент xsl:apply-templates, записываемый чаще всего внутри элемента xsl:
template, в простейшем виде пуст:
<xsl:apply-templates />
Он предписывает обработать рекурсивно все узлы-потомки узлов, отобранных родительским элементом xsl:template.
У элемента xsl:apply-templates есть необязательные атрибуты select и mode.
Атрибут select, значением которого должно быть выражение, дающее последовательность узлов, ограничивает обработку только указанными в нем узлами.
Атрибут mode выбирает режим обработки из режимов, уже определенных в
элементах xsl:template. Режим— это любое имя типа QName, но два режима
предопределены. Это текущий режим, отмечаемый словом #current, и режим
по умолчанию, принимаемый при отсутствии атрибута mode, или отмечаемый явно словом #default.
Содержимым элемента xsl: apply-templates могут служить элементы
xsl:sort и
xsl:with-param.
2. Порядок выполнения лабораторной работы
1. Изучить основы CSS.
2. Написать таблицу стилей на CSS для отображения XML-документа из
лабораторной работы №1.
3. Изучить конструкции языка XSL.
4. Написать таблицу стилей на XSL для отображения XML-документа из
лабораторной работы №1.
5. Оформить отчет, включающий постановку задачи, тексты XML, DTD,
XSD, CSS, XSL документов, демонстрацию работы программ.
6. Защитить лабораторную работу.
3. Контрольные вопросы
1. Статическая информационная модель.
2. Динамическая информационная модель.
3. Визуализация документа XML.
4. Преимущества и недостатки CSS.
5. Пространство имен. Определение. Использование.
6. Пространство имен. Использование и декларация пространства имен.
7. Адресация на языке XPath.
8. Язык трансформаций XSLT.
9. Каким образом процессор XSL трансформирует исходный документ.
10. Функции процессора XSL.
Лабораторная работа №3
Отображение xml-документа с помощью связывания данных
Цель работы: Научиться отображать XML-документы с помощью связывания данных.
1. Методические указания
Метод связывания данных [5] требует создания HTML-страницы, связывания с ней XML-документа и установления взаимодействий стандартных
HTML-элементов на странице, таких как SPAN или TABLE, с элементами
XML. В дальнейшем HTML-элементы автоматически отображают информацию из связанных с ними XML-элементов.
Вот два основных этапа при связывании данных:
1. Установка связи XML-документа с HTML-страницей, на которой вы хотите отобразить данные XML. Этот шаг обычно реализуется включением
HTML элемента с именем XML в HTML-страницу. Например, следующий
элемент на HTML-странице связывает XML-документ Book.xml со страницей:
<XML ID="dsoBook" SRC="Book.xml"></XML>
2. Сцепление HTML-элементов с XML-элементами. Когда вы сцепляете
HTML-элементы с XML-элементом, HTML-элемент автоматически отображает содержимое XML-элемента. Например, следующий элемент SPAN
на HTML-странице сцеплен с элементом AUTHOR связанного XMLдокумента:
<SPAN DATASRC="#dsoBook" DATAFLD="AUTHOR"></SPAN>
В результате HTML-элемент SPAN отображает содержимое XMLэлемента AUTHOR.
Чтобы отобразить XML-документ на HTML-странице, вы должны
установить его связь со страницей. Самый простой путь сделать это в
Microsoft Internet Explorer – включить в страницу HTML-элемент с именем
XML, так называемый фрагмент данных. Вы можете использовать одну из
двух различных форм записи для фрагмента данных.
 В первой форме весь текст XML-документа помещается между начальным и конечным тегами XML.
 Во второй форме записи HTML-элемент с именем XML остается пустым и содержит только URL XML-документа.
Когда Internet Explorer открывает HTML-страницу, его встроенный
XML-процессор синтаксически анализирует XML-документ. Internet Explorer
5 также создает программный объект, который носит название Объект исходных данных (Data Source Object DSO), который хранит данные XML и
обеспечивает доступ к этим данным. DSO хранит данные XML как набор записей, т.е. множество записей и их полей.
Когда вы сцепляете HTML-элемент с XML-элементом, DSO автоматически предоставляет значение XML-элемента и управляет всеми его свойствами. DSO также позволяет вам напрямую осуществлять доступ и манипулирование имеющимся набором записей посредством ряда методов, свойств
и событий.
Если вы открываете XML-документ через фрагмент данных на HTMLстранице, Internet Explorer проверяет, является ли документ корректно сформированным, а также – если документ включает объявление типа документа
– является ли он валидным. Однако в том случае, если документ содержит
ошибку,Internet Explorer просто не будет отображать данные XML, не выводя
сообщение об ошибке.
Вы можете осуществлять сцепление HTML-элементов с XMLэлементами двумя основными способами.
1. Табличное сцепление, что означает сцепление HTML-элемента TABLE с
данными XML, так что в таблице автоматически отображается весь набор
записей, принадлежащих XML-документу.
<TABLE DATASRC="#dsoInventory" BORDER="1" CELLPADDING="2">
<THEAD>
<TH>Title</TH>
<TH>Author</TH>
</THEAD>
<TR ALIGN="center">
<TD><SPAN DATAFLD="TITLE"
STYLE="font-style:italic"></SPAN></TD>
<TD><SPAN DATAFLD="AUTHOR"></SPAN></TD>
</TR>
</TABLE>
Если XML-документ содержит много записей, можно воспользоваться постраничный вывод, для этого необходимо:
· Установите максимальное число записей, которое будет выводиться на
странице с помощью атрибута DATAPAGESIZE элемента TABLE.
· Присвойте уникальный идентификатор атрибуту ID элемента TABLE.
<TABLE ID="InventoryTable" DATASRC="#dsoInventory" DATAPAGESIZE="5">
· Для перемещением между записями используются методы элемента TABLE
такие как FirstPage, previousPage, nextPage, LastPage.
Для отображения иерархической структуры записей можно использовать вложенные таблицы. Например, разметка для вложенной таблицы может
выглядеть следующим образом:
<TABLE DATASRC="#dsoInventory" DATAFLD="BOOK" BORDER=0
CELLSPACING=10>
2. Сцепление по отдельным записям, что означает сцепление не табличных элементов HTML (например, элементов SPAN) с XML-элементами
таким образом, что за один раз отображается только одна запись.
<SPAN STYLE="font-weight:bold" DATASRC="#dsoBook" DATAFLD="TITLE"></SPAN>
Нужно учитывать, что HTML-элемент может отобразить за раз только
одну запись DSO (объект исходных данных), ассоциированную с XMLдокументом. Для доступа к другим записям нужно воспользоваться методами
для перемещения между записями moveFirst, movePrevious, moveNext, moveLast, move, принадлежащими объекту recordset DSO.
<BUTTON ONCLICK="dsoInventory.recordset.moveFirst()"> |< First </BUTTON>
Кроме представленных существует еще ряд других способов для связывания не табличных HTML-элементов. Это могут быть как индивидуальные HTML-элементы, используемые для связывания данных по одной записи, так и HTML-элементы, содержащиеся в сцепленной таблице HTML.
Например:
<A DATASRC="dsoInventory" DATAFLD="REVIEWS"> reviews</A>
Если необходимо отобразить атрибут элемента XML-документа, то
следует учитывать, что DSO и элемент, и атрибут будет хранить как вложенные записи. Следовательно, набор записей превратится в иерархический
набор, и для отображения вложенных записей необходимо будет воспользоваться вложенной таблицей.
Чтобы иметь возможность отобразить как символьные данные, так и
атрибут как вложенную запись, следует иметь в виду то обстоятельство, что
DSO использует специальное имя $TEXT для обращения ко всем символьным данным элемента, не включая при этом значений атрибута, имя поля для
которого будет совпадать с именем атрибута. Вы можете использовать имя
$TEXT в качестве имени поля, чтобы связать ячейку таблицы с символьными
данными, содержащимися в записи элемента. Например:
<TABLE DATASRC="#dsoInventory" DATAFLD="AUTHOR">
<TR>
<TD><SPAN DATAFLD="$TEXT"></SPAN></TD>
<TD><SPAN DATAFLD="Born"></SPAN></TD>
</TR>
</TABLE>
2. Порядок выполнения лабораторной работы
1. Написать HTML-страницу, связать с ней XML-документ из лабораторной работы №1
2. Установить взаимодействие стандартных HTML-элементов на странице, таких как SPAN и TABLE, с элементами XML.
3. Оформить отчет, включающий постановку задачи, тексты XML, HTML
документов, демонстрацию работы программ.
4. Защитить лабораторную работу.
3. Контрольные вопросы
1. Основные этапы при связывании данных.
2. DSO.
3. Проверка на наличие ошибок XML.
4. Табличное сцепление данных. Постраничное отображение. Использование вложенных таблиц для отображения иерархической структуры
записей.
5. Связывание данных по одной записи. Перемещение между записями.
6. Связывание HTML-элементов с XML-атрибутами.
Лабораторная работа №4
Отображение xml-документа с помощью dom
Цель работы: Изучить основы библиотеки DOM. Научиться отображать
XML-документы с использованием DOM.
1. Методические указания
При написании сценария [2,5] вы создаете HTML-страницу, связываете
ее с XML-документом и имеете доступ к индивидуальным XML-элементам с
помощью специально написанного кода сценария (JavaScript или Microsoft
Visual Basic Scripting Edition [VBScript]). Браузер воспринимает XMLдокумент как объектную модель документа (Document Object Model – DOM),
состоящую из большого набора объектов, свойств и команд. Написанный код
позволяет осуществлять доступ, отображение и манипулирование XMLэлементами.
В браузерах Internet Explorer находятся встроенные библиотеки DOM
[2,5]. Для сценариев на стороне клиента доступно множество объектов для
работы с XML-документом, самые важные из них, объекты
 XMLDOMDocument,
 XMLDOMNode,
 XMLDOMNodeList,
 XMLDOMParseError,
представляющие интерфейс для доступа ко всему документу, отдельным его
узлам и поддеревьям, предоставляющие необходимую для отладки информацию о произошедших ошибках анализатора соответственно.
Объект XMLDOMNode [2], реализующий базовый DOM интерфейс
Node, предназначен для манипулирования с отдельным узлом дерева документа. Его свойства и методы позволяют получать и изменять полную информацию о текущем узле – его тип (dataType, nodeType, nodeTypeString),
название (baseName, prefix, nodeName ), его содержимое (attributes ,text,
nodeValue, childNodes) и т.д.
При выполнении данной лабораторной работы могут быть полезны
следующие свойства:
 nodeName – возвращает полное название (вместе с Namespace атрибутом)
текущего узла в виде строки. Доступно только для чтения.
 baseName – возвращает название элемента без префикса Namespace. Только для чтения.
 prefix – возвращает Namespace префикс. Только для чтения.
 dataType – Определяет тип содержимого текущего узла (описываемый
схемами данных). Доступно для записи и чтения.
 nodeType – Возвращает тип текущего узла. Только для чтения.
 nodeTypeString – Возвращает тип узла в виде текста. Только для чтения.
 attributes – Возвращает список атрибутов текущего узла в виде коллекции
XMLDOMNamedNodeMap. Если атрибутов нет, то свойство length будет со-
держать нулевое значение. Для тех узлов, у которых не может быть атрибутов, возвращается null. Доступно только для чтения.
 nodeValue – Возвращает содержимое текущего узла. Доступно для чтения
и записи.
 childNodes – Для тех узлов, которые имеют дочерние элементы, возвращает их список в виде XMLDOMNodeList. В том случае, если дочерних элементов нет, значение свойства length списка равно нулю. Только для чтения.
 lastChild – Возвращает последний дочерний элемент или null, если таковых
не имеется. Свойство доступно только для чтения.
 firstChild – Возвращает первый дочерний элемент или null. Только для чтения.
 nextSibling – Возвращает следующий дочерний элемент. Только для чтения.
 previousSibling – Возвращает предыдущий дочерний элемент. Доступно
только для чтения.
 parentNode – Содержит ссылку на родительский элемент. В том случае, когда такого элемента нет, возвращает null. Доступно только для чтения.
Объект XMLDOMDocument [2] представляет верхний уровень объектной иерархии и содержит методы для работы с документом: его загрузки
(readyState, load(url), loadXML(xmlString), save(objTarget), abort() и т.д.), создания в нем элементов (createElement(tagName)), атрибутов (createAttribute
(name)), комментариев (createComment(data)) и т.д. Многие свойства и методы этого объекта реализованы также в рассмотренном выше классе Node, т.к.
документ может быть рассмотрен как корневой узел с вложенными в него
поддеревьями.
Объект XMLDOMNodeList [2] представляет собой список узлов - поддеревья и содержит методы, при помощи которых можно организовать процедуру обхода дерева. Например:
 length – число элементов списка узлов;
 item(i) – выбор i-того элемента из списка. Возвращает объект
XMLDOMNode;
 nextNode() – выбор следующего элемента в списке, если такого элемента нет, то возвращает null. Первый вызов этого метода возвратит ссылку на первый элемент списка;
 reset() – сброс внутреннего указателя текущего элемента.
Объект XMLDOMParserError [2] позволяет получить всю необходимую
информацию об ошибке, произошедшей в ходе разбора документа. Все свойства этого объекта доступны только для чтения. Основные свойства:
 errorCode – содержит код возникшей ошибки либо 0, если таковой не
случилось;
 url – возвращает URL обрабатываемого документа;
 filepos – возвращает смещение относительно начала файла фрагмента, в
котором обнаружена ошибка;
 line – содержит номер строки, содержащей ошибку;
 linepos – позицию ошибки в строке, в которой была обнаружена ошибка;
 reason – описание ошибки;
 srcText – содержит полный текст строки, в которой произошла ошибка;
2. Порядок выполнения лабораторной работы
1. Создать HTML-страницу, связать ее с XML-документом из лабораторной работы №1.
2. Написать кода сценария (JavaScript или Microsoft Visual Basic Scripting
Edition [VBScript]) для доступа к индивидуальным XML-элементам.
3. Оформить отчет, включающий постановку задачи, тексты XMLдокумента и скриптов, демонстрацию работы программ.
4. Защитить лабораторную работу.
3. Контрольные вопросы
1. Объектная модель документа.
2. Зачем нужна модель DOM.
3. Использование модели DOM на сервере.
4. Использование модели DOM у клиента.
Лабораторная работа №5
Использование Path-выражений языка запросов XQUERY
Цель работы: Научиться писать запросы на языке XQuery к XML-данным,
используя PATH-выражения.
1. Методические указания
Path-выражения используются для навигации по входному документу
для выборки элементов и их атрибутов. Они состоят из одной или нескольких частей разделенных / или //.
Например:
 doc("catalog.xml")/catalog/product – выборка всех product-потомков из файла
 doc("catalog.xml")/catalog – возвращает весь элемент catalog
 doc("catalog.xml")//product – возвращает все элементы product, которые могут располагаться в документе где-угодно
 doc("catalog.xml")//product/@dept – возвращает атрибуты dept у соответстующих элементов product
 doc("catalog.xml")/catalog/* – возвращает всех потомков элемента catalog
 doc("catalog.xml")/catalog/*/number – возвращает все элементы number, которые являются потомками элемента catalog
Path-выражения возвращают узлы в порядке их следования в документе. Предикаты используются в path-выражениях, чтобы фильтровать результаты по специальному критерию.
Например:
 product[name = "Floppy Sun Hat"] – все product со значением ребенка name
равным 'Floppy Sun Hat'
 product[number < 500] – все product со значением ребенка number меньше
500
 product[@dept = "ACC"] – все product со значением атрибута dept равным
 'ACC'
 product[desc] – все product, имеющие по крайней мере одного ребенка desc
 product[@dept] – все product, имеющие атрибут dept
 product[@dept]/number – все дети number продуктов, которые имеют атрибут
dept
В предикате могут вычисляться логические выражения, если результат
вычисления равен true, то соответствующий узел возвращается, если false, то
нет.
Число 0, NaN, строка нулевой длины, пустая последовательность –
примут значение false.
Предикаты также можно использовать для указания порядковой позиции элемента (узла) в последовательности, эти предикаты иногда называются
позиционные предикаты, например:
doc("catalog.xml")/catalog/product[4]
Любое предикатное выражение, которое вычисляется как целое значение, может быть использовано как позиционный предикат.
Если мы укажем номер, который больше, чем количество элементов в
контекстной последовательности, возвратится пустая последовательность (но
не ошибка), например:
doc("catalog.xml")/catalog/product[99]
Другие примеры:
 doc("catalog.xml")/catalog/product/name[1] - обращается к первому name для
каждого product
 (doc("catalog.xml")/catalog/product/name)[1] - обращается к первому элементу
name в документе
 doc("catalog.xml")/catalog/descendant::name[1] - тоже самое, что в предыдущем случае
 doc("catalog.xml")/catalog//name[1] - обращается к первому элементу name в
любом теге (если он там есть) .
Предикаты могут быть соединены вместе, чтобы фильтровать элементы более, чем по одному критерию, например:
doc("catalog.xml")/catalog/product[number < 500][@dept = "ACC"]
или тоже самое:
doc("catalog.xml")/catalog/product[number < 500 and @dept = "ACC"]
Также множественные предикаты можно комбинировать с позиционными предикатами, например:
doc("catalog.xml")/catalog/product[@dept = "ACC"][2]
– второй product, который имеет значение атрибута dept равное "ACC".
Порядок предикатов значим, следующее выражение имеет уже немного
другой смысл:
doc("catalog.xml")/catalog/product[2][@dept = "ACC"]
– второй product, если он имеет значение атрибута равное "ACC" .
Предикаты могут содержать вызовы функций, например:
doc("catalog.xml")/catalog/product[contains(@dept, "A")]
– возвратит все product, атрибут dept которых содержит в своем значении
букву 'A'.
Предикаты могут содержать условные выражения:
doc("catalog.xml")/catalog/product[if ($descFilter) then desc else true( )]
Использование комбинированных последовательностей:
doc("catalog.xml")/catalog/product[* except number]
Использование основных сравнений:

doc("catalog.xml")/catalog/product[@dept = ("ACC", "WMN", "MEN")]
 doc("catalog.xml")/catalog/product[position( ) mod 3 = 0] – возвращает каждый
третий product из каталога.
Предикат может содержать встроенные в него другие предикаты.
Например, выражение возвращает все product, третий ребенок которых
colorChoices:
doc("catalog.xml")/catalog/product[*[3][self::colorChoices]]
Предикаты могут использоваться не только в path-выражениях, например:
 (1 to 100)[. mod 5 = 0] – возвращает числа от 1 до 100, которые делятся на 5
без остатка.
 (@price, 0.0)[1] – возвращает атрибут price, если он существует или ноль в
противном случае.
Пути в запросе не обязательно должны быть статическими, они могут
вычисляться динамически, для этого используется динамический PATH.
Например, если предварительно определены переменные elementName,
searchValue можно использовать следующий запрос:
doc("catalog.xml")//*[name( ) = $elementName][. = $searchValue]
Доступ к XML документу осуществляется с помощью встроенной
функции doc(), например:
doc("catalog_n.xml") – возвратит весь XML документ.
2. Порядок выполнения лабораторной работы
1. Произвести с помощью PATH-выражений выборку из файла “catalog_n.xml”
следующей информации:
1)
Вариант Задание
1
название продукта и его цена (для каждого продукта должно выводиться сначала его название и за ним его цена)
2
название продукта и цвета продукта, имеющиеся в наличии
3
номер продукта и его департамент
4
название продукта, его департамент и цена
5
номер продукта и цвета продукта, имеющиеся в наличии
6
номер продукта и его цена
7
департамент продукта и его цена
8
только первый ребенок продукта
9
только второй ребенок продукта
10
только третий ребенок продукта
2)
Вариант Задание
1
2
3
4
названия продуктов, цена которого больше 10, но меньше 40 и который содержит в своем названии букву ‘u’.
названия продуктов, для которых есть в наличии серый цвет (gray)
названия продуктов из департамента “MEN”, цена которых не менее 10
названия продуктов, цена которых кратна 5
7
названия продуктов и описание (desc), для продуктов у которых
нет описания вывести только номер (number)
только первое слово из названия продуктов, которые имеют номер
меньший 500
только два первых названия продуктов из департамента ACC.
8
только последний продукт для каждого департамента
9
названия продуктов, имеющие в своем названии буквы ‘a’ и ‘e’.
10
номера продуктов, название которых состоит из двух слов
5
6
3) Примечание: в данном запросе используйте условное выражение
Вариант Задание
1
2
3
4
5
6
7
название продукта, если его цена больше 20 и номер продукта в
противном случае.
номер продукта, название которого, состоит из более, чем одного
слова
название продукта и его цену, если для данного продукта есть
описание (desc), в противном случае только номер продукта
название продукта, если продукт произведен Китае, в противном
случае вывести номер продукта и его страну производитель
название продукта, если он находится в департаменте “ACC” и
произведен в Германии, в противном случае вывести номер продукта и его цену
цену продукта в евро (перевод по курсу) если он произведен в
Испании или Германии, и в юанях (перевод по курсу), если товар
произведен в Китае, в каталоге цены указаны в долларах
цену продукта, если его номер начинается с цифры «5», в противном случае его название
название продукта, для которого имеется в наличии не более двух
цветов, в противном случае его цену
для каждого продукта вывести всех его четных детей (по порядку
расположения в документе), если для этого продукта есть описание desc
для каждого продукта вывести всех его нечетных детей (по порядку расположения в документе), если для этого продукта есть цвет
8
9
10
navy
2. Реализуйте задания 1-3 с использованием динамического PATH, для этого
определите соответствующие переменные в прологе запроса.
3. Оформить отчет, включающий постановку задачи, тексты PATHвыражений, демонстрацию работы программ.
4. Защитить лабораторную работу.
3. Контрольные вопросы
1. В каком порядке PATH-выражения возвращают узлы документа?
2. Какие основные оси используются в PАTH выражениях? Приведите их
сокращения в XQuery.
3. Для чего используется групповой символ?
4. Для чего используются предикаты в PATH-выражениях?
5. Чем отличается использование основных операторов сравнения от операторов сравнения по значению?
6. Что произойдет, если в позиционном предикате будет указан номер,
больший, чем количество элементов в контекстной последовательности?
7. Что такое контекстный узел, как он обозначается и как он используется?
Лабораторная работа №6
Использование FLWOR-выражений языка запросов XQuery
Цель работы: Научиться писать запросы на языке XQuery к XML-данным,
используя FLWOR-выражения.
1. Методические указания
Выборка с помощью Path-выражений производилась ,например, так:
doc("catalog.xml")//product[@dept = "ACC" or @dept = "WMN"]/name
Path-выражения полезны, когда не происходит конструирования новых
эле-ментов или атрибутов и результат не нуждается в сортировке, pathвыражения более предпочтительны в использовании, т.к. они более компактны и быстрее вычисляются.
FLWOR-выражения используется для более сложных запросов, таких
как соединения данных из множества источников, конструирование новых
элементов и атрибутов, вычисление функций или промежуточных значений и
сортировки результата.
Например, запрос делает тоже самое, что предыдущее path-выражение:
for $prod in doc("catalog.xml")//product
let $prodDept := $prod/@dept
where $prodDept = "ACC" or $prodDept = "WMN"
return $prod/name
FLWOR может составлять целый запрос, но может являться частью
другого выражения, например:
max(for $prod in doc("catalog.xml")//product
return xs:integer($prod/number))
FLWOR – это аббревиатура слов for, let, where, order by, return.
 for - конструкция указывает на то, что FLWOR вычисляется для каждого
элемента product, на каждой итерации переменная $prod указывает на разный элемент product, знак доллара используется для определения имени
переменной.
 let - конструкция устанавливает значение переменной (позволяет избежать
многократного повторения одного выражения несколько раз)
 where - конструкция для выборки элементов по критерию (аналогично использованию предикатов в PATH выражениях)
 order by - конструкция для сортировки результата выборки
 return - конструкция указывает возвращаемые элементы выборки Pathвыражения всегда возвращают результат в том порядке, в котором данные
представленны в документе. FLWOR по умолчанию возвращает результат
в соответствии с порядком в последовательности, определенной в конструкции for.
Чтобы применить другое упорядочивание нужно использовать конструкцию order by.
Например:
for $item in doc("order.xml")//item
order by $item/@num
return $item
– элементы item будут упорядочены по возрастанию атрибута num.
Модификаторы сортировки:
• ascending и descending определяют направление сортировки, по умолчанию
ascending.
• empty greatest и empty least определяют как сортировать пустые последовательности
• collation определяет сопоставление, используемое для определения порядка
сортировки строк
Например:
order by $item/@dept descending, $item/@num descending
Модификаторы empty greatest и empty least показывают, как нужно воспринимать пустые последовательности и NaN - как самое маленькое значение
или как самое большое значение.
Если указан empty greatest, то пустая последовательность будет считаться больше, чем NaN и NaN будет считаться большим, чем остальные значения.
Если указан empty least, то пустая последовательность будет считаться
меньше, чем NaN и NaN будет считаться меньшим, чем остальные значения.
2. Порядок выполнения лабораторной работы
1. Переписать запросы заданий 1–3 Лабораторной работы № 5 из выражений
PATH в выражения FLWOR, вместо предикатов используйте соответствующие сравнения в конструкции where, в запросе используйте сортировку в соответствии с вариантом:
Вариант Сортировка
1
по цене и номеру продукта
2
по цвету и названию продукта
3
по цвету и номеру продукта
4
по цене и номеру продукта (обратная сортировка)
5
по цвету и названию продукта (обратная сортировка)
6
по цвету и номеру продукта (обратная сортировка)
7
по отношению номера продукта к его цене
8
по разности номера продукта и его цены, умноженной на 10
9
по отношению номера продукта к его цене (обратная сортировка)
10 по разности номера продукта и его цены, умноженной на 10
(обратная сортировка)
Названия продуктов выводите в новый сконструированный элемент
newprod, с атрибутом price, в который записывается цена продукта из катало-
га.
2. Оформить отчет, включающий постановку задачи, тексты FLWORвыражений, демонстрацию работы программ.
3. Защитить лабораторную работу.
3. Контрольные вопросы
1. Какие основные конструкции используются в выражениях FLWOR?
2. Для чего используются вычисляемые конструкторы?
3. Какое основное различие между PATH и FLWOR выражениями (по их
функциональности)?
4. Какая область действия у переменной объявленной в конструкции let?
5. Каким образом сортируются не типизированные значения?
6. Когда необходимо использовать устойчивую сортировку?
Лабораторная работа №7
Создание пользовательских функций языка запросов XQuery
Цель работы: Научиться писать запросы на языке XQuery к XML-данным, с
помощью определения пользовательских функций.
1. Методические указания
Пользовательские функции определяются в прологе запроса или во
внешней библиотеке. Например, определение функции в прологе, (: … :) –
обозначение комментария в XQuery:
(: определение функции:)
declare function local:discountPrice(
$price as xs:decimal?,
$discount as xs:decimal?,
$maxDiscountPct as xs:integer?) as xs:decimal?
{
let $maxDiscount := ($price * $maxDiscountPct) div 100
let $actualDiscount := min(($maxDiscount, $discount))
return ($price - $actualDiscount)
};
(: вызов функции:)
local:discountPrice($prod/price, $prod/discount, 15)
Определение функции состоит из следующих частей:
 ключевые слова declare function, за ними следует название функции
 список параметров в скобках, разделенные запятыми
 тип возвращаемого значения функции
 тело функции в фигурных скобках, заканчивающееся точкой с запятой
Тело функции - это выражение, заключенное в фигурные скобки, которое может содержать любые выражения XQuery: path-выражения, FLWOR и
др.
Например, минимальное определение функции:
declare function local:get-pi( ) {3.141592653589};
Когда значение тела функции вычислилось, оно преобразовывается в
возвращаемое значение функции, если тип возвращаемого значения не указан, то подразумевается тип item* (может быть пустой последовательностью,
атомарным значением или узлом).
Название функции должно быть подходящим XML-названием, т.е.
начинаться с буквы или подчеркивания и содержать буквы, цифры, подчеркивания, тире и точки. Также как и остальные XML-названия, имена функций зависят от регистра.
Пользовательская функция должна быть объявлена в пространстве
имен. В главном модуле запроса мы можем использовать префикс, который
определен в прологе запроса. Мы также можем использовать префикс local,
которые
связывает
функцию
с
пространством
имен
http://www.w3.org/2005/xquery-local-functions.
Если функция определена в библиотечном модуле, её название должно
быть в пространстве имен целевого модуля.
Каждый параметр функции должен иметь уникальное имя и тип (не
обязательно), начинается со знака $.
Например:
declare function local:getProdNum ($prod as element()) as element( )
{ $prod/number };
– на переменную $prod можно ссылаться в любой части тела функции.
Синтаксис вызова функций одинаковый и для встроенных и для пользовательских функций, вызов начинается с имени функции, затем перечисляются её аргументы в круглых скобках, через запятую.
Например:
substring($prodName, 1, 5)
Мы можем вставить вызов функции в конструкцию let:
let $name := substring($prodName, 1, 5)
Или в содержимое конструктора элемента:
<name>{substring($prodName, 1, 5)}</name>
Или в предикат path-выражения:
doc("catalog.xml")/catalog/product[substring(name, 1, 5) = 'Short']
Все функции имеют названия связанные с определенным пространством
имен,
встроенные
функции
принадлежат
пространству
имен
http://www.w3.org/2005/xpath-functions, встроенные функции могут быть вызваны без указания префикса своего пространства имен (т.к. оно подразумевается по умолчанию).
Если функция определена пользователем, она всегда должна вызываться через префикс, например:
declare function local:return2 ( ) as xs:integer {2};
<size>{local:return2( )}</size>
Если функция находится в другом модуле запроса, она имеет другое
пространство имен, мы должны объявить пространство имен в нашем запросе и использовать подходящий префикс.
Например:
import module namespace prod = "http://datypic.com/prod"
at "http://datypic.com/prod/module.xq";
<price>{prod:discountPrice( )}</price>
Сигнатура функций используется для определения входных параметров
и возвращаемого значения функции. Например сигнатура встроенной функции upper-case() имеет вид:
upper-case($arg as xs:string?) as xs:string
Сигнатура показывает:
• название функции, в нашем случае upper-case.
• список параметров, в нашем случае только один параметр с именем $arg и
типом xs:string?, знак вопроса показывает, что функция принимает на вход
одиночное значение xs:string или пустую последовательность
• тип возвращаемого значения функции, в нашем случае xs:string.
Может быть несколько сигнатур, связанных с одним именем функции,
с различным числом параметров, например:
substring($sourceString as xs:string?,
$startingLoc as xs:double) as xs:string
substring($sourceString as xs:string?,
$startingLoc as xs:double,
$length as xs:double) as xs:string
При вызове функции должен быть указан каждый аргумент для каждого параметра определенного в сигнатуре функции, если функция имеет более
одной сигнатуры, список аргументов может быть любым из соответствующего набора параметров сигнатур. Если функции не имеет параметров, то после
названия функции ставятся пустые скобки, например:
current-date( ).
В качестве аргументов функции могут быть не только символьные и
численные значения, но также могут быть и выражения (они вычисляются до
вызова функции), например:
concat(substring($name,1,$sublen), (if ($addT) then "T" else ""))
Замечание: вызов функции никогда не изменяет значений переменных, которые предоставляются функции в качестве аргументов. Вставка пустой последовательности или строки нулевой длины в вызов функции - это не то
же самое, если мы вообще опустим этот аргумент.
Например: substring($myString, 2) не тоже самое, что substring($myString, 2, ( )) это две разные сигнатуры, вторая функция возвратит ошибку, т.к. третий аргумент должен быть типа xs:double.
Функция upper-case() имеет один параметр, который может быть пустой
последовательностью, но вызов функции вида upper-case() будет неправильным, необходимо использовать вызов со скобками: upper-case(()).
Типы параметров отображают типы последовательностей. Наиболее
используемые типы последовательностей - это атомарные типы: xs:integer,
xs:double, xs:date, xs:string.
Тип последовательности xs:anyAtomicType соответствует любому из
атомарных типов.
Также используются индикаторы, чтобы показать как много объектов
может быть в последовательности:
 ? - 0 или 1 объект
 - 0,1 или более объектов
 + - 1 или более объектов
Если никакого индикатора не указано, подразумевается, что в последовательности только один объект. В этом случае нет различия между объектом
и последовательностью, содержащей только один этот объект, если функция
ожидает xs:string* в качестве аргумента, то можно ей подать на вход строку
"xyz".
2. Порядок выполнения лабораторной работы
1. Реализовать задание из Лабораторной работы № 5 (часть 2) в виде функций с соответствующими параметрами (узлы документа, необходимые ограничения).
2. Написать функцию в соответствии с вариантом:
1)
Вариант
Задание
1
вычисляющую среднее значение цены четных продуктов каталога
вычисляющую максимальное значения номера (number) нечетных продуктов каталога
вычисляющую сумму цен для продуктов, имеющих в своем
названии букву ‘t’
вычисляющую разность цен для продукта с наибольшей и продукта с наименьшей ценой
вычисляющую наименьшее соотношение порядкового номера
расположения продукта в документе к значению элемента
<number>
вычисляющую кол-во продуктов сделанных в Китае
2
3
4
5
6
7
вычисляющую порядковый номер продукта, цена которого
(<price>) является медианой среди цен других продуктов каталога
8
9
10
вычисляющую порядковый номер продукта, номер которого
(<number>) является медианой среди номеров других продуктов
Каталога
вычисляющую кол-во продуктов цвета navy
вычисляющую кол-во продуктов, у которых есть описание в виде элемента <desc>
2)
Вариант Задание
1
2
3
4
5
6
7
8
9
10
изменяющую структуру документа так, чтобы все атрибуты тега
product были представлены в качестве его детей
добавляющую элемент <desc> с заданным описанием в продукт,
где ещё не было элемента <desc>
переводящую названия стран-производителей в их русские эквиваленты
добавляющую в каждый продукт новый элемент <data> с заданным значением даты
заменяющую в названии продуктов каждую букву ‘o’ на строку
“hello”
изменяющую структуру документа так, чтобы все дети продукта
(product) были представлены в качестве его параметров
добавляющую новый атрибут вес (weight) с соответствующими
значениями к продуктам из департамента ACC
заменяющую названия департаментов на их полные эквиваленты:
WMN = WOMAN, ACC = ACCESORY (MEN – остается прежним)
заменяющую цены на продукты в долларах в рублевые цены по
определенному курсу
заменяющую каждый цвет black продукта на white (если имеется
цвет black), если цвета black нет для данного продукта, то добавляется цвет yellow
Примечание: определите функцию во внешнем модуле, вызов функции осуществляйте из главного модуля программы (см. объявление import module)
3. Оформить отчет, включающий постановку задачи, тексты FLWORвыражений, демонстрацию работы программ.
4. Защитить лабораторную работу.
3. Контрольные вопросы
1. Какие существуют отличия между определением пользовательской функции в прологе запроса и во внешнем подключаемом модуле?
2. Могут ли выражения использоваться в качестве аргументов функции? Если да, то приведите пример.
3. Что показывает сигнатура функций?
4. Какие индикаторы используются для указания количества объектов в последовательности?
Лабораторная работА № 8
Создание web-сервиса для обработки XML-документа
Цель работы: Изучить основные принципы создания WEB- сервисов.
1. Методические указания
Сервис
Для того чтобы создать самый простой Web-сервис [1,8], который по
запросу пользователя будет выдавать текущую дату или комбинацию даты и
времени, в среде разработки Visual Studio .NET следует выполнить команду
меню File | New | Project и в появившемся диалоговом окне New Project в
наборе Templates выделить значок ASP.NET Web Service. В поле Name следует указать наименование создаваемого проекта. После того, как все необходимые приготовления средой разработки будут сделаны, на основном рабочем поле появятся две новые страницы. Одна будет предназначена для
разработки визуального дизайна, а на второй будет располагаться код нашего
сервиса. Естественно, у создаваемого сервиса не может быть внешнего вида
как такового, ему нечего отображать, поэтому страницу для дизайна можно
спокойно закрыть.
В состав одного проекта может входить несколько отдельных сервисов.
Для нашего примера потребуется всего один Web-сервис, заготовка для которого создается средой разработки Visual Studio. NET автоматически, поэтому ничего изменять не потребуется, и мы можем сразу перейти на страницу с наименованием Service1.asmx.vb. На этой странице нужно разместим
код нашего Web-сервиса:
<WebMethod()> Public Function MyDate(ByVal ShowTime As Boolean) As String
Dim MD As DateTime
If ShowTime Then
MyDate = MD.Now
Else
MyDate = MD.Today
End If
End Function
После компиляции к созданному Web-сервису можно обратиться даже
из браузера. При попытке обращения к Web-сервису Web-сервером генерируется Web-страницы. На этой Web-странице расположена ссылка на формальное описание структуры Web-сервиса, а также перечислены все функции, поддерживаемые Web-сервисом. В нашем случае, естественно, указана
лишь одна функция MyDate.
Наименование функции также является гиперссылкой, нажав на которую можно перейти к Web-странице, позволяющей воспользоваться этой
функцией. После щелчка мышью на ссылке в браузере будет отображена
Web-страница. На этой странице расположено поле ввода, в котором пользователь может указать значение параметра, передаваемого функции.
В результате работы функции сервиса получим:
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">11.08.2006 23:03:54</string>
XML-документ в качестве источника данных
Создадим Web-сервис, который будет включать единственную функцию, возвращающую обычный набор данных (DataSet), содержащий информацию, взятую из XML-файла [8].
Для этого создадим новый проект Web-сервиса. На его страницу отбуксируем один компонент DataSet с вкладки Data. При этом будет актировано
диалоговое окно AddDataset, в котором разработчику предлагается указать
тип создаваемого набора данных. Так как в нашем случае XML-файл может
содержать данные любой структуры, то для набора данных нельзя заранее
указать структуру. Следовательно, в этом диалоговом окне разработчик должен выбрать переключатель Untyped dataset.
Фрагмент кода Web-сервиса приведен ниже.
<WebMethod()> Public Function XMLData(ByVal file As String) As DataSet
Dim FS As IO.FileStream
Dim Reader As IO.StreamReader
FS = New IO.FileStream(Server.MapPath(file), IO.FileMode.Open,
IO.FileAccess.Read)
Reader = New IO.StreamReader(FS)
DataSet1.ReadXml(Reader)
FS.Close()
XMLData = DataSet1
End Function
Для создания клиентского приложения нужно для начала создать новый проект. Для этого следует выполнить команду меню File | New | Project.
В появившемся диалоговом окне New Project в наборе Templates выбрать
шаблон Windows Application и в поле Name указать наименование создаваемого приложения.
После этого Visual Studio .NET создаст форму с именем Form1, устанавливаемым по умолчанию. В окне этой формы нам потребуется разместить
один элемент TextBox, одно текстовое поле Label, одну кнопку Button, один
компонент DataGrid, и один компонент DataSet с вкладки Data. Пример формы приведен на рисунке 2.
Рис. 2.
После этого следует установить связь с искомым Web-сервисом. Для
этого надо в окне Solution Explorer выбрать наименование создаваемого приложения и правым щелчком мыши вызвать для него контекстное меню. В
этом контекстном меню необходимо выполнить команду Add Web Reference,
после чего будет активизировано одноименное диалоговое окно, позволяющее установить ссылки на используемые сервисы.
Для того чтобы получить ссылки на функции Web-сервиса и перенести
их в проект, нужно в текстовом поле Address указать URL необходимого сервиса и загрузить ресурс, располагающийся по этому адресу. После этого в
левой части искомого окна Add Web Reference будет отображено содержимое
стартовой Web-страницы.
После того как искомые ссылки на функции Web-сервиса будут найдены, при помощи кнопки Add Reference их необходимо добавить к разрабатываемому проекту. После чего можно обращаться к функциям Web-сервиса в
приложении (функция Button_Click).
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.
EventArgs) Handles Button1.Click
Dim xml = New WindowsApplication2.localhost.Service1()
DataSet1.Merge(xml.XMLData(TextBox1.Text))
End Sub
2. Перечень вопросов к разработке
1. Изучить основные принципы создания Web-сервисов.
2. Создать web-сервис, который будет использовать XML-документ, созданный в лабораторной работе 1, в качестве источника данных. То
есть создать Web-сервис, возвращающий обычный набор данных, содержащий информацию, взятую из XML-файла.
3. Дополнить созданный web- сервис процедурами позволяющими:
a. сохранять данные в XML-документе;
b. находить по заданной строке данные в XML-документе;
c. заменять одну строку на другую;
d. добавлять данные в XML-документ;
e. удалять данные из XML документа.
4. Создать клиентское приложение, работающее с разработанным webсервисом.
5. Оформить отчет, включающий постановку задачи, тексты программ, демонстрацию работы программ.
6. Защитить лабораторную работу.
3. Контрольные вопросы
1. Web-службы. Основные понятия. Назначение.
2. История развития Web-служб.
3. Модель COM/DCOM. .
4. Стандарт CORBA/IIOP.
5. Web-службы .Net. Достоинства. Архитектура.
6. Базовые технологии web-служб: SOAP.
7. Базовые технологии web-служб: UDDI.
8. Базовые технологии web-служб: WSDL.
СПИСОК ЛИТЕРАТУРЫ
1. Алекс Феррара, Мэтью Мак-Дональд Программирование web-сервисов
для .NET.
2. А.
Печерский.
Язык
XML
-
практическое
введение.
Часть
2.
http://www.citforum.ru/internet/xml2/index.shtml
3. Бумфрей Ф., Дирецо О., Дакетт Й. и др. XML. Новые преспективы WWW.
Пер. с англ. – М.:ДМК, 2000 – 688 с.
4. Марк Зайден XML для электронной коммерции. – Издательство: Бином.
Лаборатория знаний , 2003 – 480 с.
5. Основы XML. http://www.intuit.ru
6. Основы работы с CSS. http://www.intuit.ru
7. Скотт Шорт. Разработка XML Web-сервисов средствами Microsoft. NET
(+CD-ROM) Building XML Web Services for the Microsoft .NET Platform
2003
8. Хабибуллин И.Ш. Самоучитель XML. – СПб.: БХВ-Петербург, 2003. –
336с.
9. Шапошников И.В. Web-сервисы Microsoft .Net. – СПб.: БХВ-Петербург,
2002. – 336 с.
Download