Литература по курсам «Интернет-технологии», «Информационные технологии в экономике»




Дата канвертавання28.04.2016
Памер0.94 Mb.

КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ

ИНСТИТУТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

КАФЕДРА ЭКОНОМИЧЕСКОЙ КИБЕРНЕТИКИ



ПИНЯГИНА О.В.


Технология

XML

и ее приложения
(XML и все-все-все)

УДК 681.3.06

ББК 32.988 – 018
Печатается по постановлению редакционно-издательского совета

Института вычислительной математики и информационных технологий

Казанского (Приволжского) федерального университета
Рецензенты:

………………………………..

………………………………….

Пинягина О.В.

Технология XML и ее приложения: Учебное пособие / О.В. Пинягина – Казань: Казанский государственный университет, 20**. – *** с.

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

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

Пособие может быть использовано как дополнительная литература по курсам «Интернет-технологии», «Информационные технологии в экономике», «Базы данных», «Программирование в среде 1С:Предприятие», а также при подготовке курсовых и дипломных работ.


 Казанский государственный

университет, 20**

 Пинягина О.В., 20**


Содержание


Содержание 3

Предисловие 5

Глава 1. Основы XML 6

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



Глава 2. DTD 8

Элементы 9

Атрибуты 11

Сущности 12



Глава 3. XML schema 14

Глава 4. Стили для XML-документов: CSS и XSLT 16

CSS 17


XSL 19

Глава 5. XML и PHP 26

RSS-каналы 26

Организация RSS-канала серверными средствами 27

XML, PHP и mySQL 32

DOMXML в PHP4 35

Глава 6. XML и Ajax 38

Следить за кем-то – это так нудно! 38

Организация RSS-канала клиентскими средствами 42

Глава 7. XML и SQL server 48

Загрузка XML-данных посредством OPENXML 48

Выгрузка XML-данных с помощью директивы FOR XML 51

57



Глава 8. XML и «1С:Предприятие» 58

Импорт данных 58

Экспорт данных 59

Работа с web-сервисами 61



Глава 9. XML и .NET 65

Классы XMLNode, XMLDocument 65

Сериализация 69

Глава 10. XML и ASP.NET 77

Выгрузка и загрузка данных в формате XML через файлы 77

Загрузка данных из XML-файла в базу данных 77

Выгрузка данных в XML-файл 79

Выгрузка и загрузка данных в формате XML в выходной поток /из входного потока 81

Выгрузка данных 81

Загрузка данных 83

Выгрузка и загрузка данных в формате XML через web-сервисы 85

Загрузка данных 85

Выгрузка данных 87

89



Литература 90

WEB-ресурсы 90

Работа с XML – это не какая-то будничная и монотонная задача.

Она требует артистизма, страсти, экзальтации и эксцентричности.

Стивен Холзнер


Предисловие

Аббревиатура XML расшифровывается как eXtensible Markup Language – расширяемый язык разметки. Считается, что XML идет на смену языку HTML вследствие ограниченных возможностей последнего. Не могу полностью согласиться с этим тезисом – XML не столько заменяет, сколько дополняет HTML. Эти два языка имеют совершенно разные цели. HTML создавался для визуального представления информации в Web и прекрасно справляется с этой задачей. XML же с самого начала был предназначен для четкого представления структуры документа в виде дерева с возможностью легкого доступа к любой его вершине.

На сегодняшний день XML фактически является стандартом для обмена данных между приложениями. Современные программные продукты обязательно содержат средства для обработки XML-документов. Возможности некоторых из них мы и рассматриваем в данной книге.

Глава 1. Основы XML

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


Ключевым понятием XML, как и HTML, является тэг – команда, заключенная в угловые скобки. Однако между тэгами HTML и тэгами XML есть существенные различия. С одной стороны, стандартных тэгов XML (кроме управляющих команд) не существует – их придумывает сам разработчик, исходя из потребностей предметной области. С другой стороны, требования к применению тэгов XML гораздо более строгие, чем для HTML. Основные правила здесь следующие:



  • в названиях тэгов регистр символов является существенным: тэги и представляют собой разные команды;

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

  • допускаются самозакрывающиеся тэги, такие как ;

  • в документе должен быть только один корневой тэг, являющийся контейнером для всех остальных данных;

  • следует строго соблюдать вложенность тэгов-контейнеров: не допускается такая последовательность команд: (правильно будет, например, или );

  • значения атрибутов должны быть заключены в одинарные или двойные кавычки;

  • первой строкой документа должна быть управляющая команда с номером версии XML и другими (необязательными) параметрами:

Документ, удовлетворяющий этим правилам, называется well-formed (хорошо оформленным). Такой документ, например, будет корректно отображаться браузером Internet Explorer 6.0.

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

encoding="windows-1251"?>
Таким образом, хорошо оформленным будет, например, следующий документ:





Война и мир

Л.Н. Толстой

массовое издание

1000


$50






The <a href="/religious-hypocrisy-running-head-religious-hypocrisy.html">Adventures of Huckleberry Finn</a>

Mark Twain

mass market paperback

298


$5.49






Moby-Dick

Herman Melville

hardcover

724


$9.95






Fight Club

Chuck Palahniuk

PDF

194


$1.35







Глава 2. DTD


Кроме хорошо оформленных (well formed), различают еще и правильные (valid) документы. XML-документ называется правильным, если он является хорошо оформленным и соответствует своему DTD или своей XML схеме. Давайте разберемся, что это означает.

DTD расшифровывается как Document Type Definition – определение структуры документа – и представляет собой часть XML-файла или отдельный файл, содержащий подробные определения для всех тэгов и их атрибутов.

Если DTD встроен в XML-документ, то в документе должна быть команда .

Если DTD определен в отдельном файле, то в документе должна быть команда .

Встроенный DTD представляет собой команду следующего вида;

[

Описания элементов, атрибутов, сущностей



]

>
Например, XML-документ со встроенным DTD может выглядеть так:



encoding="windows-1251" standalone="yes"?>


[

]



>

Это Правильный Документ




Если DTD определен в отдельном файле, то в XML-документе должна быть ссылка на этот файл:

а сам DTD-файл должен содержать только описания элементов, атрибутов и сущностей.



Замечание: вместо слова SYSTEM в этой команде может применяться слово PUBLIC – для «публичных» стандартов, принятых W3C.

Элементы


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


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



encoding="windows-1251" standalone="yes"?>


[

]



>



Война и мир, Л.Н. Толстой

The Adventures of Huckleberry Finn, Mark Twain

Moby-Dick, Herman Melville

Fight Club, Chuck Palahniuk


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

  • знак «+» – один или более раз;

  • знак «*» – ноль или более раз;

  • знак «?» – ноль или один раз.

Так, в нашем каталоге может быть несколько книг, но не менее одной.

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



encoding="windows-1251" standalone="yes"?>


[

]







Война и мир

Л.Н. Толстой

1000


$50






The Adventures of Huckleberry Finn

Mark Twain

298


$5.49






Moby-Dick

Herman Melville

724


$9.95






Fight Club

Chuck Palahniuk

194


$1.35





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

Атрибуты


Как и HTML-тэги, XML-тэги могут содержать атрибуты. Эти атрибуты можно интерпретировать как свойства объектов, например,

Атрибуты тоже должны быть определены в DTD. Список атрибутов тэга задается при помощи команды . Каждый атрибут имеет имя, тип и модификатор, например:

lang (ru | en) #IMPLIED

type CDATA #REQUIRED >

Тип данных может быть строковый (CDATA), перечислимый (список возможных значений в скобках), либо маркер. В нашем примере атрибут type может принимать любое строковое значение, атрибут lang принимает значения ru или en.

Модификаторы указывают:

#IMPLIED – элемент не является обязательным;

#REQUIRED – элемент является обязательным;

#FIXED – элемент является константой.


Сущности


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

Для того чтобы вставить сущность в XML-документ, достаточно записать ее имя, предварив его знаком амперсанда (&).

Окончательный вид нашего документа с определением элементов, атрибутов и сущностей приведен ниже.

encoding="windows-1251" standalone="yes"?>


[

]



>





Война и мир

Л.Н. Толстой

массовое издание

1000


$50






The Adventures of Huckleberry Finn

Mark Twain

mass market paperback

298


$5.49






Moby-Dick

Herman Melville

hardcover

724


$9.95






Fight Club (&perevod;)

Chuck Palahniuk

PDF

194


$1.35





Глава 3. XML schema


DTD, конечно, является удобным средством определения структуры документа, но у него есть очевидные ограничения. Так, например, мы не можем средствами DTD указать, что количество страниц должно являться целым положительным числом не более 5000 или задать какой-либо более сложный шаблон для атрибутов. Для таких случаев можно вместо DTD воспользоваться таким понятием, как XML схема.

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

Приведем пример. На основе следующего XMl-документа создадим XML схему.



GAB="103, 40, 120" COLOR="Темный"

KOMPL="Дуб" KOD="000000020"/>

GAB="103, 60, 60" COLOR="Темный, Ваниль"

KOMPL="Дуб, Стекло" KOD="000000016"/>

GAB="103, 50, 50" COLOR="Темный, Ваниль"

KOMPL="Дуб" KOD="000000015"/>

GAB="180, 200, 30" COLOR="Темный"

KOMPL="Дуб" KOD="000000017"/>




http://www.w3.org/2001/XMLSchema

xmlns:wmh="http://www.wmhelp.com/2003/eGenerator"

elementFormDefault="qualified">




































Подробно об XML-схемах можно прочитать в [2], [3], [6].


Глава 4. Стили для XML-документов: CSS и XSLT


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


 

  (View Source for full doctype...)>

-



-

  <b>Война и мир</b>

  Л.Н. Толстой

  массовое издание

  1000

  $50

 


-

  <b>The Adventures of Huckleberry Finn</b>

  Mark Twain

  mass market paperback

  298

  $5.49

 

-



  <b>Moby-Dick</b>

  Herman Melville

  hardcover

  724

  $9.95

 

-



  <b>Fight Club (Translated by I.Kormiltcev.)</b>

  Chuck Palahniuk

  PDF

  194

  $1.35

 

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

CSS


Технология CSS (Cascading Style Sheets) – каскадные стилевые таблицы – была разработана как дополнение языка HTML и позволяет создавать единые стили оформления для целых сайтов. Эту технологию можно применить и для отображения XML-документов.

Рассмотрим несколько эклектичный пример форматирования нашего документа с помощью CSS-стилей.

Для этого создадим файл style.css со следующими назначениями:

BOOK

{

display: block;



background-image: url(Leaf.bmp);

margin-top: 10px;

border: thin dotted Green;

}

TITLE



{

font-weight: bold;

font-style: italic;

font-size: 14pt;

color: #006400;

background-color: #F5F5DC;

}

AUTHOR


{

font-weight: bold;

font-size: 14pt;

color: green;

}

BINDING


{

display: block;

font-size: 12pt;

font-weight: bold;

}

FORMAT


{

display: block;

font-size: 12pt;

font-weight: bold;

color: blue;

}


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

Так, например, контейнер , согласно стилевому файлу, представляет собой блок-прямоугольник (display: block) с заданным фоновым рисунком (background-image: url(Leaf.bmp)), зеленой пунктирной рамкой (border: thin dotted Green) и зазором между блоками в 10 пикселей (margin-top: 10px). Подобным образом задаются и стили для тэгов , <author>, <format> и <binding>. <a href="/e-e-obratite-vnimanie-rebenka-na-to-chto-boleshaya-bukva-e-i-m.html">Обратите внимание</a>, что для тэгов </p> <br />и <br />стили не заданы, поэтому информация будет напечатана стилем, принятым в браузере по умолчанию. <p>Этот стилевой файл нужно подключить в <b>XML</b>-документе строкой</p> <br /> <br /><?xml-stylesheet type="text/css" href="style.css"?> <p>Следует отметить, что технология <b>CSS</b> имеет некоторые существенные ограничения. Так, в частности, мы не можем изменить порядок следования тэгов в документе, не можем создать гиперссылки и отобразить картинки, не можем даже вывести информацию в виде таблицы. (Хотя в стандарте CSS level2 имеются назначения display:table; display:table-row; display: table-cell; и т.п., но, например, Internet Exporer 6.0 эти назначения не понимает.) Более сложное и изощренное форматирование можно получить, применяя технологию <b>XSL</b>.</p> <br /><h2> XSL</h2> <p>Технология <b>XSL</b> расшифровывается как <b>eXtensible Stylesheet Language</b>. На сегодняшний момент это официальный стилевой язык для <b>XML</b>. С его помощью можно отформатировать <a href="/skaji-chamu-nash-dobri-vyaliki-narod-skarisya-perad-cemraj-i-s.html">наш документ так</a>, как показано на следующий странице.</p> <p>Для получения такого результата создадим файл style2.xsl со следующим содержимым: <br /> <br /><?xml version="1.0" encoding="windows-1251" ?> <br /> <br /><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <br /> <br /><<b>xsl:template</b> match="/"> <br /> <br /><HTML> <br /> <br /><BODY bgcolor="#ccddee"> <br /> <br /><table border="1" cellspacing="0" cellpadding="2" bordercolor="blue"> <br /> <br /><tr> <br /> <br /><span> </span> <th><span>Название</span></th> <br /> <br /><span> </span> <th><span>Автор</span></th> <br /> <br /><span> </span> <th><span>Цена</span></th> <br /> <br /><span> </span> <th><span>Страниц</span></th> <br /> <br /><span> </span> </tr> <br /> <br /><span> </span> <<b>xsl:apply-templates</b> select="CATALOG/BOOK" /> <br /> <br /><span> </span> </table> <br /> <br /><span> </span> </BODY> <br /> <br /><span> </span> </HTML> <br /> <br /><span> </span> </xsl:template> <br /> <br /><<b>xsl:template</b> match="BOOK"> <br /> <br /><tr> <br /> <br /><td> <br /> <br /><span> </span> <<b>xsl:value-of</b> select="TITLE" /> <br /> <br /><span> </span> </td> <br /> <br /><td> <br /> <br /><span> </span> <<b>xsl:value-of</b> select="AUTHOR" /> <br /> <br /><span> </span> </td> <br /> <br /><td> <br /> <br /><span> </span> <<b>xsl:value-of</b> select="PRICE" /> <br /> <br /><span> </span> </td> <br /> <br /><td> <br /> <br /><span> </span> <<b>xsl:value-of</b> select="PAGES" /> <br /> <br /><span> </span> </td> <br /> <br /><span> </span> </tr> <br /> <br /><span> </span> </xsl:template> <br /> <br /><span> </span> </xsl:stylesheet> <br /><img src="43278_html_m52868efa.png" name="graphics3" align=bottom width=532 height=305 border=0> <br />Следует заметить, что сам <b>XSL</b>-файл представляет собой хорошо оформленный (well-formed) <b>XML</b>-файл. Первая строка является стандартной. </p> <p>Тэг <xsl:stylesheet> представляет собой корневой элемент стилевого файла. Далее <b>XSL</b>-файл содержит набор шаблонов оформления для различных тэгов из <b>XML</b>-файла. </p> <p>Эти шаблоны представлены тэгами-контейнерами <xsl:template>. Параметр match="Имя-тэга" указывает, к какому тэгу относится данный шаблон. Значение "/" означает корневой элемент <b>XML</b>-файла. Внутри шаблона могут присутствовать <b>HTML</b>-тэги. В нашем примере шаблон для корневого элемента содержит шапку таблицы с названиями стоблцов. Далее тэг <xsl:apply-templates select="<b>CATALOG/BOOK</b>" /> означает, что в данном месте должен быть применен шаблон для тэга <book>. Обратите внимание, что здесь не требуется использовать цикл – шаблон будет применен столько раз, сколько тэгов <book> было в документе. </p> <p>Шаблон <xsl:template match="<b>BOOK</b>"> формирует строку <b>HTML</b>-таблицы, в ячейки которой с помощью команд <xsl:value-of> подставляются значения из тэгов, <a href="/vpn-setup-guide-on-windows-xp.html">указанных в параметре select</a>, например, select="<b>PAGES</b>". Обратите внимание, что из всех данных о книге мы выбираем только название, автора, цену и количество страниц.</p> <p>Для подключения стилевого файла в <b>XML</b>-документ следует включить строку <br /> <br /><?xml-stylesheet type="text/xsl" href="style2.xsl"?> <br />Рассмотрим другой стилевой файл: <br /> <br /><?xml version="1.0" encoding="windows-1251" ?> <br /> <br /><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <br /> <br /><xsl:template match="/"> <br /> <br /><h2>Список книг, отсортированный по автору</h2> <br /> <br /><xsl:<b>for-each</b> select="CATALOG/BOOK" <b>order-by</b>="+AUTHOR"> <br /> <br /><span>Название: </span> <br /> <br /><xsl:value-of select="TITLE"/> <br /> <br /> <br /><span>Автор: </span> <br /> <br /><xsl:value-of select="AUTHOR"/> <br /> <br /> <br /><span>Тип: </span> <br /> <br /><xsl:value-of select="BINDING"/> <br /> <br /><xsl:value-of select="FORMAT"/> <br /> <br /> <br /><span>Страниц: </span> <br /> <br /><xsl:value-of select="PAGES"/> <br /> <br /> <br /><span>Цена: </span> <br /> <br /><xsl:value-of select="PRICE"/> <br /> <br /> <br /></xsl:for-each> <br /> <br /></xsl:template> <br /> <br /></xsl:stylesheet> <br /><img src="43278_html_m44e18bac.png" name="graphics4" align=bottom width=563 height=530 border=0> <br />Обратите внимание, что здесь не задается шаблон для тэга <book>, а вместо этого используется цикл, и тэг <xsl:<b>for-each </b>select="CATALOG/BOOK"> применяется столько раз, сколько в <b>XML</b>-файле было книг. В этом тэге также задана сортировка по автору, в порядке возрастания: <b>order-by</b>="+AUTHOR". Для сортировки по убыванию знак «плюс» следует поменять на «минус». На картинке показан результат применения этого стилевого файла. </p> <p>В предыдущих примерах мы применяли стили к XML-тэгам. Что же делать в том случае, когда требуется вывести информацию из атрибутов тэга? Следующий пример даёт ответ на этот вопрос. Обратите внимание также, каким образом выводить в браузер изображения. </p> <br /> <br /><img src="43278_html_m72c5af72.png" name="graphics5" align=bottom width=521 height=528 border=0> <p>XML-Документ:</p> <br /> <br /><?xml version="1.0" encoding="UTF-8"?> <br /> <br /><?xml-stylesheet type="text/xsl" href="style.xsl"?> <br /> <br /><allmebel> <p> <MEBEL NAME="Комод Black Stone" PIC="20.jpg" </p> <p>GAB="103, 40, 120" COLOR="Темный" </p> <p>KOMPL="Дуб" KOD="000000020"/></p> <p> <MEBEL NAME="Стол журнальный Black Stone" PIC="16.jpg" </p> <p>GAB="103, 60, 60" COLOR="Темный, Ваниль" </p> <p>KOMPL="Дуб, Стекло" KOD="000000016"/> </p> <p> <MEBEL NAME="Тумба под ТВ Black Stone" PIC="15.jpg" </p> <p>GAB="103, 50, 50" COLOR="Темный, Ваниль" </p> <p> KOMPL="Дуб" KOD="000000015"/></p> <p> <MEBEL NAME="Кровать двуспальная Black Stone" PIC="17.jpg" </p> <p> GAB="180, 200, 30" COLOR="Темный" </p> <p>KOMPL="Дуб" KOD="000000017"/> <br /> <br /></allmebel> </p> <p>Стилевой файл:</p> <br /> <br /><?xml version="1.0" encoding="windows-1251"?> <br /> <br /><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <br /> <br /><xsl:template match="/"> <br /> <br /><table border="1" bordercolor="blue"> <br /> <br /><xsl:for-each select="/ALLMEBEL/MEBEL"> <br /> <br /><tr> <br /> <br /><td> <br /><span>Название: </span> <br /> <br /><xsl:value-of select="<b>@NAME</b>"/> <br /><span>Габариты: </span> <br /> <br /><xsl:value-of select="<b>@GAB</b>"/> <br /><span>Цвет: </span> <br /> <br /><xsl:value-of select="<b>@COLOR</b>"/> <br /><span>Комплектация: <br /> <br /></span> <br /> <br /><xsl:value-of select="<b>@KOMPL</b>"/> <br /> <br /></td> <br /> <br /><td> <br /> <br /><b><img src="{@pic}" /></b> <br /> <br /></td> <br /> <br /></tr> <br /> <br /></xsl:for-each> <br /> <br /></table> <br /> <br /></xsl:template> <br /> <br /></xsl:stylesheet> <br />Итак, стилевые файлы позволяют отформатировать наш <b>XML</b>-документ для приведения его к виду, удобному для чтения. Особенно мощной <a href="/prohojdenie-silent-hill-homecoming-pc.html">здесь является технология </a><b>XSL</b>, подробнее о которой вы можете узнать из книги [2]. Однако зачастую <b>XML</b>-документ служит не для визуального представления информации в браузере, а для ее дальнейшей обработки, например, для записи в базу данных. В таком случае не обойтись без разработки программ-анализаторов <b>XML</b>-документов на каком-либо языке программирования. Некоторые из таких направлений рассмотрены в последующих главах. <br /><h2> Глава 5. XML и PHP</h2> <h2> RSS-каналы</h2> <br />Аббревиатуру <b>RSS</b> расшифровывают по-разному. Так или иначе, <b>RSS</b> предназначено для обмена новостями между сайтами. Сайт-хозяин новости <b>размещает</b> ее в формате <b>XML</b> по заданному адресу. После этого любой другой сайт может <b>обратиться</b> к этой новости, <b>отформатировать</b> ее и <b>опубликовать</b> для своих читателей. При этом используется стандартный набор тэгов, специально разработанный для <b>RSS</b>-каналов. Смысл этих тэгов понятен из их названий. <p>Рассмотрим, например, новости-прогноз погоды, которые <a href="/instrukciya-po-napolneniyu-sajta-kontentom-s-pomosheyu-wordpre.html">предоставляет известный сайт </a><b>Gismeteo.ru</b><b>. </b>Прогноз погоды для г. Казани содержится в файле <u>http://informer.gismeteo.ru/rss/27595.xml</u></p> <br /> <br /><?xml version="1.0" encoding="windows-1251" ?> <br /> <br /><b>-</b><rss xmlns:gismeteo="<b>http://www.gismeteo.ru</b>" version="<b>2.0</b>"> <br /> <br /><b>-</b> <channel> <br /> <br /><span> </span> <title><b>GISMETEO.RU: </b><b>Погода</b><b> </b><b>от</b><b> </b><b>ФОБОС</b><b> </b><b>и</b><b> </b><b>Мэп</b><b> </b><b>Мейкер</b>

  http://www.gismeteo.ru

  Прогноз погоды по 4500+ городам России и Мира

  60

-

  <b>GISMETEO.RU: Погода от ФОБОС и Мэп Мейкер</b>

  142

  18

  http://www.gismeteo.ru

  http://img.gismeteo.ru/images/gismeteo2.gif

 

-

  <b>Казань</b><b>: </b><b>Утро</b><b> 12 </b><b>окт</b><b>, </b><b>Пт</b>

  http://www.gismeteo.ru/towns/27595.htm?1026259

  пасмурно, небольшой дождь, температура +2..+4 С, давление 745..747 мм рт.ст., ветер Северо-Западный, 4 м/с

  Погода

 

  GISMETEO.RU: Погода в г. Казань

  1090476

 


-

  <b>Казань</b><b>: </b><b>День</b><b> 12 </b><b>окт</b><b>, </b><b>Пт</b>

  http://www.gismeteo.ru/towns/27595.htm?1006293

  малооблачно, без осадков, температура +4..+6 С, давление 749..751 мм рт.ст., ветер Северо-Западный, 3 м/с

  Погода

 

  GISMETEO.RU: Погода в г. Казань

  1030168

 

. . .


 

 
Итак, в XML-файле с данными для RSS-канала корневым является тэг со служебной информацией, в котором располагается тэг – непосредственно канал новостей.

В нем, прежде всего, содержится общая информация – заголовок новости (), ссылка на сайт (<link>), краткое описание (<description>) и информация о картинке сайта (<image>). </p> <p>Далее в документе располагаются один или несколько тэгов <item>, содержащих составные части новости – в данном случае, прогнозы погоды на день, вечер, ночь и т.п. Каждый тэг <item>, в свою очередь, <a href="/operacionnaya-sistema-windows-982000xp.html">представляет собой контейнер</a>, содержащий заголовок, ссылку, краткое описание, ссылку на картинку и другие тэги. При публикации новости мы можем использовать либо все эти данные, либо их часть. Заметим, что здесь мы не можем задать в <b>XML</b>-документе ссылку на стилевой файл для представления данных, так как этот документ расположен на чужом сервере. </p> <p>Рассмотрим, как можно организовать обработку такого RSS-файла серверными или клиентскими средствами.</p> <br /><h2> Организация RSS-канала серверными средствами</h2> <p>Для публикации новости серверными средствами будем использовать технологию PHP. В РНР есть набор функций, позволяющий работать с XML-файлом, как с линейным потоком информации, т.е., по технологии SAX: </p> <br /><ul> <li> <br /><b >xml_parser_create()</b> <br /></ul> <br />Создает экземпляр обработчика XML. <br /><ul> <li> <br /><b >xml_set_element_handler(parser, startElementFunction, endElementFunction)</b> <br /></ul> <br />Функция определяет обратные вызовы, которые должен осуществлять обработчик при нахождении открывающих и закрывающих тэгов. <br /> <br /><b >startElementFunction</b> определяет функцию для открывающих тэгов, <b >endElementFunction,</b> соответственно, для закрывающих. <b >parser</b> — это объект, возвращенный функцией <b >xml_parser_create()</b>. <br /><ul> <li> <br /><b >xml_set_chracter_data_handler(parser, characterDataFunction)</b> <br /></ul> <br />Данная функция определяет обратный вызов, осуществляемый <a href="/v-p-reutov-n-v-samosudova-n-p-larionova-l-m-chajlahyan.html">при обработке события</a>, связанного с нахождением данных, содержащихся между XML-тэгами. Назначение параметров аналогично <b >xml_set_element_handler()</b>. <br /><ul> <li> <br /><b >xml_parse(parser, data, endOfDocument)</b> <br /></ul> <br />Эта функция инициализирует анализ переданного ей XML-кода. Параметр <b >endOfDocument</b> должен быть равен <b >true</b>, если параметр <b >data</b> содержит конец документа, или же <b >false</b>, если <b >data</b> не включает в себя документ до конца. Это позволяет обработчику корректно обрабатывать незавершенные тэги и прочие ошибки форматирования документа, возникающие в связи с тем, что переменная <b >data</b> не может содержать данные длиной более 4-х килобайт. <br /><ul> <li> <br /><b >xml_parser_free(parser)</b> <br /></ul> <br />Функция освобождает память, занятую объектом <b >parser</b>. <br />Прежде всего, создадим класс <b>RSSParser</b>, внутри которого будет выполняться вся работа по разбору <b>XML</b>, и который будет выводить на печать (или же в поток вывода от сервера к браузеру) форматированные <b>HTML</b>-данные. После создания класса получим <b>RSS</b>-данные от сервиса <b>Gismeteo.ru</b> и инициализируем обработчик <b>XML</b>, который будет использовать для <a href="/viii-klass-105-gadzin-vadyushina-d-s-francuzskij-yazik-8-klass.html">событийной обработки класс </a><b >RSSParser</b>. <br /> <br /><? <br />class RSSParser <p>{ <p>var $insideItem=false;</p> <br /> <br />var $tag=""; </p> <p>var $title="";</p> <p>var $description=""; </p> <p>var $originalLink="";</p> <p>var $image=""; <br />function mystart($parser, $name, $attrs) </p> <p>{ <p>if($this->insideItem)</p> <br /> <br />{ </p> <p>$this->tag=$name;</p> <p>if($name=="ENCLOSURE") </p> <p>{ <p>$this->image=$attrs["URL"];</p> <br /> <br />} </p> <p>} <p>elseif($name=="ITEM")</p> <br /> <br />{ </p> <p>$this->insideItem=true; </p> <p>} <p>} <br />function myend($parser, $name)</p> <br /> <br />{ </p> <p>if($name=="ITEM")</p> <p>{ <p>printf("<big>%s</big> ", $this->title);</p> <br /> <br />printf("<image src='%s'> <br />", $this->image); </p> <p>printf("%s ", $this->description);</p> <p> printf("больше...<hr>", </p> <p>$this->originalLink);</p> <p>$this->title=""; </p> <p>$this->insideItem=false;</p> <p>$this->title=""; </p> <p>$this->description="";</p> <p>$this->originalLink=""; </p> <p>} <p>else</p> <br /> <br />{ </p> <p>$this->tag="";</p> <p>} <p>} <br />function mystr($parser, $data)</p> <br /> <br />{ </p> <p>if($this->insideItem)</p> <p>{ <p>switch($this->tag)</p> <br /> <br />{ </p> <p>case "TITLE":</p> <p>$this->title=$data; </p> <p>break; <br /></p> <br />case "DESCRIPTION": <p>$this->description=$data;</p> <p>break; <p>case "LINK":</p> <br /> <br />$this->originalLink=$data; </p> <p>break; <br /></p> <br />} <p>} <p>}</p> <br /> <br />} </p> <p>$xml_parser=xml_parser_create();</p> <p>$rss_parser= new RSSParser(); <br />xml_set_object($xml_parser, &$rss_parser); </p> <p>xml_set_element_handler ($xml_parser, "mystart", "myend");</p> <p>xml_set_character_data_handler ($xml_parser, "mystr"); <br />$fp=fopen("http://informer.gismeteo.ru/rss/27595.xml", "r") or </p> <p>die("Error!");</p> <br />while($data=fread($fp, 4096)) <p>{ <p>xml_parse($xml_parser,$data);</p> <br /> <br />} </p> <p>fclose($fp);</p> <br />xml_parser_free ($xml_parser) <p>?> <br />Этот сценарий можно включить в любое место нашего сайта. Результат его работы приведен на следующей странице.</p> <p>Как уже было сказано, прежде всего, в сценарии создается класс-обработчик RSSParser. В этом классе нужно определить 3 функции – обработчик открывающего тега, обработчик закрывающего тэга и обработчик текстовой информации внутри тэга. Кроме того, в классе определены несколько переменных. Переменная $insideItem служит флажком для определения, находимся ли мы сейчас внутри тэга <item> или нет. Остальные переменные нужны для временного хранения содержимого текущих тэгов – заголовка, описания, ссылки на картинку и т.п. <br /> <br /><img src="43278_html_m453a48b2.png" name="graphics6" align=bottom width=466 height=332 border=0> <br />В качестве обработчика открывающего тэга определим функцию <b>mystart</b><b> ($parser, $name, $attrs). </b>Параметр <b>parser</b> — это уже известный объект, созданный функцией <b>xml_parser_create()</b>. Параметр <b>name</b> — название того тэга, который анализирует обработчик XML, а параметр <b>attrs</b> — <a href="/blinkov-evgenij-aleksandrovich-ekologicheskaya-ocenka-vliyaniy.html">ассоциативный массив</a>, содержащий атрибуты текущего тэга. <br /> <br /><i>Стоит отметить, что имена тэгов в PHP-коде должны задаваться только(!) прописными буквами.</i> </p> <p>Функция <b>my</b><b>end ($parser, $name)</b> отвечает за обработку события, возникающего при обнаружении закрывающего тэга. Параметр <b>n</b><b>ame</b> содержит имя этого тэга. Именно эта функция выводит всю информацию, которую получает класс во время обработки <b>XML</b>-документа. Она же обнуляет все внутренние переменные по завершении вывода.</p> <p>Функция <b>mystr ($parser, $data)</b> обрабатывает данные, которые находятся внутри <b>XML</b>-тэгов, присваивая свойствам класса соответствующие значения. </p> <p>Создание класса требуется для того, чтобы передавать параметры из одной функции обратного вызова в другую (их передают свойства класса), не используя директиву <b>global </b>и глобальные переменные.</p> <p>Далее в сценарии мы создаем стандартный XML-анализатор: </p> <p>$xml_parser=xml_parser_create();</p> <br />создаем объект только что созданного нами класса: <br />$rss_parser= new RSSParser(); <br />назначаем его в качестве обработчика содержимого XML-файла: <p>xml_set_object($xml_parser, &$rss_parser);</p> <br />назначаем обработчики открывающих и закрывающих тэгов: <br />xml_set_element_handler ($xml_parser, "mystart", "myend"); <br />и обработчик содержимого тэга: <br />xml_set_character_data_handler ($xml_parser, "mystr"); <br />Затем мы открываем <b>XML</b>-источник, читаем из него данные и передаем их на обработку функции <b>xml_parse</b>. По окончании работы освобождаем <b>XML</b>-анализатор. <p>Такой подход можно использовать, если в нашем распоряжении есть доступ к серверу и возможность создавать свои серверные сценарии. Как же быть в том случае, если у нас есть возможность создавать и размещать в сети только <b>HTML</b>-страницы? Решение проблемы будет рассмотрено в главе 6.</p> <br /> <br /><h2> XML, PHP и mySQL </h2> <p>В следующем примере PHP-сценарий получает в качестве <a href="/metodika-vosstanovleniya-dannih-s-propuskami.html">входных данных документ</a>, содержащий информацию о блюдах сегодняшнего меню:</p> <br /><b><?xml version="1.0" encoding="windows-1251" ?> </b> <br /> <br /><b><Menu></b> <br /> <br /><b><Course Name="Кофе Мокко" Price="45" Kod="000000007" /> </b> <br /> <br /><b><Course Name="Кофе Эспрессо" Price="55" Kod="000000008" /> </b> <br /> <br /><b><Course Name="Лимонад" Price="30" Kod="000000006" /> </b> <br /> <br /><b><Course Name="Кефир" Price="5" Kod="000000014" /> </b> <br /> <br /><b><Course Name="Пицца Маргарита" Price="120" Kod="000000009" /> </b> <br /> <br /><b><Course Name="Салат Мимоза" Price="60" Kod="000000010" /> </b> <br /> <br /><b><Course Name="Овощной салат" Price="35" Kod="000000011" /> </b> <br /> <br /><b><Course Name="Хлеб" Price="1" Kod="000000012" /> </b> <br /> <br /><b></Menu></b> <br />Это меню нужно переписать в базу данных <b>mySQL</b><b>. </b>В базе данных под названием <b>SunnyTown</b> имеется таблица блюд меню, созданная следующей командой: <p>create table menu </p> <p>(kod varchar(9) NOT NULL, </p> <p>data date NOT NULL, </p> <p>name varchar(50), </p> <p>price numeric(6,2),</p> <p>primary key (kod, data)); <br />В следующем сценарии основные действия с данными выполняются в обработчике <b>mystart</b>. Из атрибутов XML-тэга <COURSE> читаются данные о блюде, и выполняется соответствующая команда <b>INSERT</b>. Текущая дата задается с помощью функции mySQL <b>CURDATE().</b> <br /><? </p> <p>class MYParser</p> <p>{ <p>var $insideItem=false;</p> <br /> <br />var $tag=""; </p> <p>var $name="";</p> <p>var $price=0; </p> <p>var $kod="";</p> <br />function mystart($parser, $name, $attrs) <p>{ <p>if($name=="COURSE")</p> <br /> <br />{ </p> <p>$this->name=$attrs["NAME"];</p> <p>$this->kod=$attrs["KOD"]; </p> <p>$this->price=$attrs["PRICE"];</p> <p>$insert="INSERT INTO menu(kod, data, name, price) VALUES('".$this->kod."', CURDATE(),'".$this->name."'," </p> <p>.(0+$this->price). ")";</p> <p>mysql_query($insert) or die("Insert Error"); </p> <p>} <p>}</p> <br />function myend($parser, $name) </p> <p>{} <br />function mystr($parser, $data)</p> <p>{} <p>} <br />$xml_parser=xml_parser_create();</p> <br /> <br />$my_parser= new MYParser(); <br />xml_set_object($xml_parser, &$my_parser); </p> <p>xml_set_element_handler ($xml_parser, "mystart", "myend");</p> <p>xml_set_character_data_handler ($xml_parser, "mystr"); <br />$data=$HTTP_RAW_POST_DATA; <br />mysql_connect("localhost", "root", "") or </p> <p>die ("Connecting Error!");</p> <p>mysql_select_db("SunnyTown") or </p> <p>die ("Database Error!");</p> <p>$delete="DELETE FROM menu WHERE data=CURDATE()"; </p> <p>mysql_query($delete);</p> <br />xml_parse($xml_parser,$data); <br />xml_parser_free ($xml_parser); <p>print "OK";</p> <p>?> <br />В данном примере XML-документ передается внутри POST-запроса, и обращаться к нему в PHP-сценарии можно с помощью глобальной переменной <b>$HTTP_RAW_POST_DATA</b>. <br /> <br /><h2> DOMXML в PHP4 </h2> </p> <p>В отличие от SAX-технологии, в которой XML-документ рассматривается как линейный поток байтов, при использовании DOM-технологии из XML-документа <a href="/etaj--obekt.html">создается иерерхический объект</a>, т.е., дерево, по узлам которого мы и перемещается в ходе программы.</p> <p>Рассмотрим пример для версии PHP4 (для более новых версий он работать не будет!). Из XML-документа, содержащего список книг <br /><?xml version="1.0" encoding="windows-1251"?> <br /><CATALOG> <br /> <br /><BOOK type="paper" lang="ru"> <br /> <br /><TITLE>Война и мир

Л.Н. Толстой

массовое издание

1000


$50






The Adventures of Huckleberry Finn

Mark Twain

mass market paperback

298


$5.49






Moby-Dick

Herman Melville

hardcover

724


$9.95






Fight Club

Chuck Palahniuk

PDF

194


$1.35





мы хотим сформировать такой HTML-документ:





BOOK LIST



$dom = xmldocfile ("http://localhost/Inventory.xml");

// читаем XML-файл и создаем объект DOM-дерево


$root = $dom->root(); // получаем корень дерева
print "

BOOK LIST

";

print "

    ";


    $arr=$root->children(); // получаем всех потомков корня
    for($i=0; $i // и перебираем их в цикле

    {

    if ($arr[$i]->tagname=="BOOK")

    // действия только для тэга

    {

    $arr2=$arr[$i]->children();

    // получаем всех потомков текущего узла дерева

    for($j=0; $j

    {

    if ($arr2[$j]->tagname=="TITLE")

    // действия только для тэга </p> <p>{ <br /> <br /><b>$arr3=$arr2[$j]->children();</b> </p> <p>// получаем всех потомков текущего узла дерева </p> <p>print "<li>"; </p> <p>print_r(<b>$arr3[0]->content</b>); </p> <p>// печатаем содержимое первого потомка - это текст</p> <p>} <p>} <br /> <br />}</p> <br /> <br />} </p> <p>print "</ol>";</p> <br /> <br /><b>?></b></course></course></course></course></course></course></course></course></course></item></image></enclosure></item></enclosure></item></image></description></link></channel></rss></mebel></mebel></mebel></mebel></body></html></span></mebel></mebel></mebel></mebel></format>



База данных защищена авторским правом ©shkola.of.by 2016
звярнуцца да адміністрацыі

    Галоўная старонка