Разработка клиентских приложений Web-сайтов

Отображение содержимого XML-документов

Показывать лекцию целиком

Презентацию к данной лекции Вы можете скачать здесь.

Отображение данных с помощью элемента управления Xml

Рассмотрим, каким образом можно отобразить содержимое XML-документа на web-странице с помощью серверного элемента управления ASP.NET Xml и преобразования XSLT.

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

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

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

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

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

    Предположим, у нас есть xml-файл, в котором содержатся сведения о товарах. Нам нужно иметь возможность отображать как все данные целиком, так и лишь заголовки. Для этого мы создадим два файлы XLS-преобразования, один XML-файл и одну ASP.NET- страницу [1].

    Запускаем Visual Web Developer. Создаем XML-файл Products.xml и сохраняем его в папке App_Data.

    <?xml version="1.0" encoding="windows-1251" ?>
    <Products>
      <Product id="101">
        <ProductName>Sharp LC-32 LE600 RU</ProductName>
        <Price>38990 руб.</Price>
        <Manufacturer>Польша</Manufacturer>
        <Warranty>3 года</Warranty>
        <Description>
          Серия ЖК телевизоров c оригинальной "шарповской" Full HD панелью 10-го поколения и светодиодной подсветкой Full LED.
        </Description>
      </Product>
      <Product id="109">
        <ProductName>Samsung UE-32 B6000</ProductName>
        <Price>39900 руб.</Price>
        <Manufacturer>Россия</Manufacturer>
        <Warranty>2 года</Warranty>
        <Description>
          Элегантный Samsung UE-32 B6000, оснащенный технологией устранения бликов Ultra Clear Panel, поможет вам 
          превратить свою гостиную в уютный кинозал. Благодаря использованию светодиодов (LED) для подсветки 
          вместо обычных люминесцентных ламп толщина этого телевизора составляет всего 3 см.
        </Description>
      </Product>
      <Product id="123">
        <ProductName>Philips 42PFL9803H/10</ProductName>
        <Price>99900 руб.</Price>
        <Manufacturer>Бельгия</Manufacturer>
        <Warranty>1 год</Warranty>
        <Description>
          Погрузитесь в мир незабываемых впечатлений с 42-дюймовым широкоформатным телевизором Philips 42PFL9803H/10. 
          Новая технология Ambilight Spectra 2, которая используется в нем, добавит яркости и четкости изображению, 
          а LED Lux передаст всю цветовую гамму изображения максимально естественно.
        </Description>
      </Product>
    </Products>

    Теперь добавим в проект два XSL-преобразования: Products_all.xslt, с помощью которого на экран будут выводиться все данные и Products_headers.xslt (выводит только заголовки). Оба файла нужно сохранить в папке App_Data.

    <?xml version='1.0'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
      <xsl:template match="/">
        <html>
          <body>
            <table cellspacing="10" cellpadding="4">
              <xsl:for-each select="Products/Product">
                <tr bgcolor="#CCCCCC">
                  <td class="info">
                    Название товара: <strong>
                      <xsl:value-of select="ProductName"/>
                    </strong>
                    <br /><br />
                    Цена: <strong>
                      <xsl:value-of select="Price"/>
                    </strong>
                    <br /><br />
                    Страна-производитель: <strong>
                      <xsl:value-of select="Manufacturer"/>
                    </strong>
                    <br /><br />
                    Гарантия: <strong>
                      <xsl:value-of select="Warranty"/>
                    </strong>
                    <br /><br />
                    <br /><br />
                    <xsl:value-of select="Description"/>
                  </td>
                </tr>
              </xsl:for-each>
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    <?xml version='1.0'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
      <xsl:template match="/">
        <html>
          <body>
            <table cellspacing="3" cellpadding="8">
              <tr bgcolor="#AAAAAA">
                <td class="heading">
                  <strong>Название товара</strong>
                </td>
                <td class="heading">
                  <strong>Цена</strong>
                </td>
                <td class="heading">
                  <strong>Страна-производитель</strong>
                </td>
              </tr>
              <xsl:for-each select="Products/Product">
                <tr bgcolor="#DDDDDD">
                  <td width="25%" valign="top">
                    <xsl:value-of select="ProductName"/>
                  </td>
                  <td width="20%" valign="top">
                    <xsl:value-of select="Price"/>
                  </td>
                  <td width="55%" valign="top">
                    <strong>
                      <xsl:value-of select="Manufacturer"/>
                    </strong>
                  </td>
                </tr>
              </xsl:for-each>
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>

    Добавим к проекту ASP.NET-страницу. Из панели инструментов перетащим элемент управления Xml и настроим его таким образом, чтобы свойство DocumentSource стало равно "~/Products.xml", а свойство TransformSource стало равно "~/App_Data/Products_headers.xslt".

    Дале, нам нужно разместить элемент управления CheckBox выше элемента управления Xml. У элемента управления CheckBox свойство Text нужно сделать равным "Только заголовки", Свойство checked - True, AutoPostBack - тоже True. Дважды щелкнем по элементу управления Checkbox и введем в обработчике событий следующий код:

    If CheckBox1.Checked Then
        Xml1.TransformSource = "~/App_Data/Products_headers.xslt"
    Else
        Xml1.TransformSource = "~/App_Data/Products_all.xslt"
    End If

    Запустив проект, мы получим следующий результат:

    (рис 15.2) Отображение только заголовков(рис 15.1) Отображение всей информации

    Отображение с помощью элемента управления GridView

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

    Вначале нам нужно создать XML-файл - MythicalAnimals.xml, в котором будут храниться сведения о мифических животных:

    <?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
    <MythicalAmimals>
      <Animal Title="Сфинкс"
          Place="Египет, Месопотамия, Греция"
          Description="Египетскими сфинксами называют мифических существ, 
          которые в скульптурной традиции культуры представляют собой стражей. 
          Арабское название Великого Сфинкса, Абу аль-Холь, переводится как "отец страха".">
        <comments>
          <userComment rating="4"
              comment="В отличие от сфинкса в Египте, Месопотамии и Греции, 
              где это существо "прожило" ровно столько же, сколько и сама цивилизация,
              азиатский сфинкс жив до сих пор. Первые изображения этого мифического существа
              появились в Азии как подражание эллинистическому искусству, но сфинксы Мадхуры,
              Каусамби и Санчи, датируемые третьим веком до нашей эры, 
              абсолютно не похожи на своих греческих сородичей. " />
          <userComment rating="2"
              comment="В шестнадцатом веке появилось такое понятие как "французский сфинкс". 
             Это существо представляло собой льва с головой и грудью прекрасной девушки, 
             чьи уши нередко были украшены серьгами. Ученые считают это гротеском древнего образа,
             утверждая, что идентичными фигурами был украшен дворец Нерона." />
        </comments>
      </Animal>
      <Animal Title="Минотавр"
           Place="Эллада"
           Description="В греческой мифологии Минотавр представлял собой наполовину человека,
            наполовину быка. Он проживал в центре Лабиринта - запутанной конструкции,
           построенной на Крите для царя Миноса и спроектированной архитектором Дедалом, 
           чтобы удерживать чудовище вдали от людей. Минотавр переводится с греческого как "миносский бык", 
           а на Крите его называют Астерион и связывают с царем Миносом кровными узами.">
        <comments>
          <userComment rating="3"
              comment="Когда пришла очередь третьего жертвоприношения, стать одним из семи юношей, 
              вызвался Тезей. Он пообещал отцу, что в случае удачи, повесит белый флаг на своем корабле на обратном пути. 
              Дочь Миноса, Ариадна, влюбилась в Тезея, и дала ему клубок ниток, чтобы он не смог заблудиться в лабиринте. 
             Тезей убил Минотавра и вывел афинян из пещеры." />
          <userComment rating="4"
              comment=" На обратном пути Тезей забыл сменить черные паруса на белые и причалил с ними к родным берегам. 
              Эгей каждый день выглядывал на скале своего сына, и, увидев, черные паруса, 
              от горя бросился в море, которое с тех пор называется Эгейским. 
              Минос же, будучи в ярости, оттого что Тезею удалось сбежать, заключил Дедала и Икара 
              в высокую башню, откуда они смогли сбежать при помощи самодельных крыльев. " />
        </comments>
      </Animal>
      <Animal Title="Химера"
          Place="Холмистые равнины Ликии"
          Description="Химера (греч. "коза) - мифическое создание, фигурирующее в мифе про Беллерофонта. 
          Согласно этому мифу чудовище Химера наводило страх на всю округу. 
          Представляло оно собой существо с исполинским телом козы, львиной головой, крыльями и змеиным хвостом. 
           Из медной пасти Химеры бил огонь. Своих жертв чудовище затаптывало, опаливало огнем или убивало огромным хвостом." >
        <comments>
          <userComment rating="3"
              comment="В современном русском языке химерами называют несбыточные мечтания,
              существа с причудливыми очертаниями (чаще всего, совершенно отличными от прообраза 
              в древнегреческом мифе)." />
        </comments>
      </Animal>
      <Animal Title="Кентавры"
          Place="Греция"
          Description="В греческой мифологии кентавры представляли собой расу существ, 
          внешний вид которых представлял собой получеловека-полуконя. 
          В ранней аттической росписи они изображены в виде человеческого торса, 
          прикрепленного к телу коня." >
        <comments>
          <userComment rating="4"
              comment="Греческое слово кентавр может иметь такую этимологию, как кен-таурос, 
              то есть "раб быка". Некоторые считают, что своего кентавра герки взяли из Месопотамии, 
              где он символизировал бога Ваала, олицетворявшего дождь и плодородие, 
              поражающего рогами демона Мота, олицетворяющего летнюю засуху (в греческом варианте Мот стал называться Лупусом). 
              И только позднее в Греции образ кентавров перенесли на чужеземцев с севера, 
              скачущих на лошадях. " />
        </comments>
      </Animal>
      <Animal Title="Горгульи"
          Place="Греция"
          Description="Горгулий можно с уверенностью назвать ближайшими родственниками химер. 
          Однако используется это понятие, в основном, не в мифологическом контексте, 
          а в архитектурном, где горгулью нередко путают с собственно химерой. 
          Как такового понятий горгулья в мифологическом словаре не существует, 
          оно появилось только в районе двенадцатого века с определенным архитектурным стилем 
          и происходило от латинских корней или французского gargouille, 
          что означало "стекать, глотать", так как фигурки были прикреплены к стокам на крыше зданий." >
      </Animal>
    </MythicalAmimals>

    Файл нужно сохранить в каталоге /App_Data.

    Отображение XML-данных в элементе управления GridView

    Чтобы сделать данные доступными для элементов управления на web-странице ASP.NET, используется элемент управления источника данных [2].

    Настройка доступа к данным XML-файла

    Откроем файл Default.aspx и переключимся в режим конструктора.

    Из группы Данные в панели элементов перетащим на страницу элемент управления XmlDataSource.

    В меню ЗадачиXmlDataSource выберем команду Настроить источник данных.

    Откроется диалоговое окно Настройка источника данных <DataSourceName>.

    В поле Файл данных вводим ~/App_Data/MythicalAnimals.xml.

    Нажмем кнопку .

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

    Теперь можно отображать XML-данные в списочном элементе управления. Отобразим часть XML-данных в элементе управления GridView.

    Базовое отображение XML-данных с помощью элемента управления GridView

    Из группы Данные в панели элементов перетащим на страницу элемент GridView.

    В списке Выбор источника данных в меню Задачи GridView выберем XmlDataSource1.

    Нажмем клавиши CTRL+F5 для запуска страницы.

    (рис 15.3) Связывание XML-файла с элементом управления GridView

    Связывание XML-файла с элементом управления TreeView

    Элемент управления TreeView позволяет отображать данные с иерархической структурой. Пользователи могут открывать отдельные узлы, которые в свою очередь содержат дочерние узлы. Элемент управления TreeView используется для отображения данных XML, но его также можно применять для любых данных, которые можно представить иерархически [3,4].

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

    Запускаем MS Visual Web Developer 2008 Express Edition. Создаем asp.net-страницу со следующим кодом (Default.aspx):

    <%@ Page Language="VB" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
      <head id="Head1" runat="server">
        <title>Пример связывания XML-файла с элементом управления TreeView</title>
    </head>
    <body>
        <form id="form1" runat="server">
          <asp:xmldatasource id="XmlDataSource1" 
          runat="server" datafile="Life.xml" 
          transformfile="Life.xsl"/>
          <asp:treeview id="TreeView1" runat="server" datasourceid="XmlDataSource1">
            <databindings>
              <asp:treenodebinding depth="1" datamember="TypeOfAnimals" 
              textfield="name" valuefield="name"/>
              <asp:treenodebinding depth="2" datamember="ClassOfAnimals"  
              textfield="title" valuefield="AnimalID"/>
              <asp:treenodebinding depth="3" datamember="order" 
              textfield="name" valuefield="num"/>
            </databindings>
          </asp:treeview>
        </form>
      </body>
    </html>

    Затем создаем файл Life.xml:

    <?xml version="1.0" encoding="windows-1251" ?>
    <kingdom>
      <TypeOfAnimals name="Членистоногие">
        <ClassOfAnimals AnimalID="0000000000">
          <title>Насекомые</title>
          <Description>Имеют шесть ног</Description>
          <orders>
            <order num="1" name="ЖЕСТКОКРЫЛЫЕ" />
            <order num="2" name="ЧЕШУЕКРЫЛЫЕ" />
            <order num="3" name="ПЕРЕПОНЧАТОКРЫЛЫЕ" />
          </orders>
        </ClassOfAnimals>
    
        <ClassOfAnimals AnimalID="0000000001">
          <title>Ракообразные</title>
          <Description>Ракообразные населяют любые существующие на Земле водоемы</Description>
          <orders>
            <order num="1" name="УСОНОГИЕ" />
            <order num="2" name="ВЕСЛОНОГИЕ" />
            <order num="3" name="ЛИСТОНОГИЕ" />
            <order num="4" name="ДЕСЯТИНОГИЕ" />
            <order num="5" name="РОТОНОГИЕ" />
          </orders>
        </ClassOfAnimals>
      </TypeOfAnimals>
    
      <TypeOfAnimals name="Хордовые">
        <ClassOfAnimals TypeOfAnimals="novel" AnimalID="1111111111">
          <title>Млекопитающие</title>
          <Description>Вскармливают детенышей молоком</Description>
          <orders>
            <order num="1" name="ПРИМАТЫ" />
            <order num="2" name="ПАРНОКОПЫТНЫЕ" />
            <order num="3" name="КИТООБРАЗНЫЕ" />
          </orders>
        </ClassOfAnimals>
    
        <ClassOfAnimals TypeOfAnimals="novel" AnimalID="1111111112">
          <title>Птицы</title>
          <Description>Класс ПТИЦЫ (Aves) класс позвоночных животных, 
         тело которых покрыто перьями и передние конечности видоизменены 
         в органы полета - крылья.</Description>
          <orders>
            <order num="1" name="ВОРОБЬИНЫЕ" />
            <order num="2" name="ГАГАРЫ" />
            <order num="3" name="ГОЛУБИ" />
            <order num="4" name="ДЯТЛЫ" />
            <order num="5" name="ЖУРАВЛИ" />
            <order num="6" name="КИВИ" />
          </orders>
        </ClassOfAnimals>
      </TypeOfAnimals>
    </kingdom>

    Таблица стилей XSL (файл Life.xsl), выполняющая преобразование данных XML, обладает следующей структурой:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="kingdom">
        <kingdom>
          <xsl:apply-templates select="TypeOfAnimals"/>
        </kingdom>
      </xsl:template>
      <xsl:template match="TypeOfAnimals">
        <TypeOfAnimals>
          <xsl:attribute name="name">
            <xsl:value-of select="@name"/>
          </xsl:attribute>
          <xsl:apply-templates select="ClassOfAnimals"/>
        </TypeOfAnimals>
      </xsl:template>
      <xsl:template match="ClassOfAnimals">
        <ClassOfAnimals>
          <xsl:attribute name="AnimalID">
            <xsl:value-of select="@AnimalID"/>
          </xsl:attribute>
          <xsl:attribute name="title">
            <xsl:value-of select="title"/>
          </xsl:attribute>
          <xsl:attribute name="Description">
            <xsl:value-of select="Description"/>
          </xsl:attribute>
          <xsl:apply-templates select="orders/order" />
        </ClassOfAnimals>
      </xsl:template>
      <xsl:template match="order">
        <order>
          <xsl:attribute name="num">
            <xsl:value-of select="@num"/>
          </xsl:attribute>
          <xsl:attribute name="name">
            <xsl:value-of select="@name"/>
          </xsl:attribute>
          <xsl:apply-templates/>
        </order>
      </xsl:template>
    </xsl:stylesheet>

    Запустите проект. Результат получится такой:

    (рис 15.4) Отображение содержимого XML-файла с помощью элемента управления TreeView

    Краткие итоги

    Таблицы XSLT применяются для преобразования содержимого исходного XML-документа в другой документ, отличный по формату или структуре (например, для преобразования XML в HTML). Элемент управления XmlDataSource делает данные в XML-файле доступными для элементов управления, находящихся на странице. Данные доступны в двух форматах: иерархическом и табличном. Элементы управления, привязанные к элементу управления XmlDataSource, могут получать данные в подходящем формате. Табличные данные удобно отображать с помощью элемента управления GridView, а данные с иерархической структурой - TreeView.

    Набор для практики

    Вопросы:

  • Что такое XSLT- преобразование?
  • Можно ли к одному XML-файлу применять сразу несколько XSLT-таблиц? Если да, то как?
  • Какой элемент управления лучше подходит для иерархических данных? Какой лучше для табличных данных?
  • Упражнения:

  • Создайте приложение, отображающее прайс-лист некой фирмы в кратком и подробном виде с помощью элемента управления Xml.
  • Разработайте программу, в которой иерархия: ВУЗ $$\to$$ Факультет $$\to$$ Специальность отображалась бы с помощью элемента управления TreeView.
  • Отобразите сведения о неком заказе с помощью элемента управления GridView.
  • Вернуться к учебному плану