ASP.Net. Лекция 10. Работа с XML (исходники)

Асмик Гаряка

Лекция 9

Язык - не сын, а отец мысли.
Оскар Уайльд

Аббревиатура XML расшифровывается как Extensible Markup Language, в переводе «расширяемый язык разметки». Как и язык HTML, он является подмножеством SGML (Standard General Markup Language) - «дедушки» языков разметки. Мы уже не раз сталкивались с форматом XML. Таков формат конфигурационных файлов, файла описания объектных источников данных.

XML - это универсальный, независящий от платформы стандарт описания информациии, который можно использовать для представления иерархических данных и унификации передаваемой информации. Без его знания невозможно понимание SOAP и следовательно, веб-сервисов. XML стал де-факто стандартом передачи данных в сети Интернет. Стандарт XML и связанных с ним форматов определяется консорциумом W3C(World Wide Web Consortium). Например, мы создаем aspx страницы в формате XHTML - переходном между HTML и XML, стандарт которого тоже определен W3C. Стандарт XHTML налагает более строгие правила на правильное формирование документа, аналогичные правилам XML.

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

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

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

  <?xml version="1.0" encoding="utf-8" ?>

Декларация не является частью XML-документа и не имеет закрывающего тега. В тексте XML-файла могут находиться комментарии в стиле HTML - <!-text -->.

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

  <b><i>Какой-то текст</b></i>

является ошибкой в XML.

У тегов могут быть атрибуты. Значения атрибутов должны быть заключены в кавычки. Порядок атрибутов значения не имеет. Между открывающим и закрывающими тегами может находится текст. В XML сохраняются все пробелы, находящиеся в тексте. Если текста нет, можно применить сокращенную форму записи. Пример тега XML:

  <PROPERTY Label="ogl_extension" Value="4520" Itemtype="predefined" />

Это краткая форма тега

  <PROPERTY Label="ogl_extension" Value="4520" Itemtype="predefined"></PROPERTY>

Вам это ничего не напоминает? Правила описания элементов ASP.NET точно такие же.

Существует атрибут xmlns, который определяет пространство имен. Значением его может быть любое уникальное имя. Существует договоренность использовать URL, так как они уникальны. Пространства имен имеют смысл, аналогичный их применению в .NET Framework - чтобы не смешивать одинаковые имена, используемые разными разработчиками. Название пространства имен отделяется от имени двоеточием.

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

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

Браузеры IE 6.0, FireFox 1.5 отображают XML-файлы с выделением синтаксиса. Родительские узлы можно раскрывать и закрывать. Например, в закрытом виде корневой узел файла BirthDay.xml выглядит так:

   <BD>

Если его раскрыть, увидим:

   <BD> 
   <Item Type="Plugin"> 
     <LinkText>Отправить поздравительную открытку</LinkText>  
     <PluginID>Friendship</PluginID>  
     <InitData />  
     </Item> 
   <Item Type="URL"> 
     <AdditionalText>Отправить поздравительную открытку</AdditionalText>  
     <URL>www.icq.com</URL>  
   </Item> 
   </BD> 

Среды разработки Visual Studio и VWD Express проверяют правильность xml-документов прямо во время редактирования.

AdRotator

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

  <?xml version="1.0" encoding="utf-8" ?> 
  <Advertisements 
  xmlns="http://schemas.microsoft.com/AspNet/AdRotator-Schedule-File"> 
  </Advertisements> 

Внутри узла Advertisements располагаются узлы <Ad> </Ad>

У этих узлов имеются 5 атрибутов, все они необязательны.

ImageUrl

Картинка, которая будет демонстрироваться при выборе данного объявления

NavigateUrl

Адрес, по которому будет совершен переход при щелчке на картинку

AlternateText

Альтернативный текст, если показ изображений выключен

Impressions

Все значения Impressions суммируются. Вероятность показа рекламы равна значению Impressions, деленному на эту сумму.

Keyword

Ключевое слово-категория рекламы, позволяет фильтровать объявления

Пример файла AdvertismentFile, он называется ads.xml.

  <?xml version="1.0" encoding="utf-8" ?> 
  <Advertisements 
  xmlns="http://schemas.microsoft.com/AspNet/AdRotator-Schedule-File"> 
    <Ad> 
      <ImageUrl>fixed.gif</ImageUrl> 
      <NavigateUrl>http://www.im.am</NavigateUrl> 
      <AlternateText>Бесплатный хостинг</AlternateText> 
      <Impressions>40</Impressions> 
      <Keyword>хостинг</Keyword> 
    </Ad> 
    <Ad> 
      <ImageUrl>logo2.jpg</ImageUrl> 
      <NavigateUrl>http://www.nv.am</NavigateUrl> 
      <AlternateText>Газета "Новое время"</AlternateText> 
      <Impressions>50</Impressions> 
      <Keyword>новости</Keyword> 
    </Ad> 
    <Ad> 
      <ImageUrl>summer.jpg</ImageUrl> 
      <NavigateUrl>http://www.utro.ru</NavigateUrl> 
      <AlternateText>Певицу Жасмин избил муж!</AlternateText> 
      <Impressions>100</Impressions> 
      <Keyword>желтые новости</Keyword> 
    </Ad> 
  </Advertisements> 

На страницу помещен элемент управления. Его свойство AdvertisementFile указывает на этот файл.

  <asp:AdRotator ID="AdRotator1" runat="server" 
          AdvertisementFile="ads.xml" Height="164px" Width="574px" />

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

В предыдущих версиях ASP.NET можно было работать только с файлами XML. Теперь можно использовать любой источник данных, связавшись с элементом управления-источником данных. В таком случае необходимо указать как минимум 3 поля источника в свойствах ImageUrlField, NavigateUrlField и AlternateTextField.

  <asp:AdRotator ID="AdRotator2" runat="server"
  DataSourceId="SqlDataSource1" AlternateTextField="Alternate"
  ImageUrlField="Image" NavigateUrlField="NavigateUrl" />

Файлы преобразования документа

Известно, что для форматирования HTML-файлов часто используются CSS (Cascading Stylesheets), хотя это необязательно, так как браузеры соотносят со всеми тегами определенный внешний вид. Элемент <p> задает параграф, <B> - полужирный шрифт - браузер знает, как их показывать.

Поскольку XML не использует изначально заданные теги, их значение может быть каким угодно: <table> может означать таблицу HTML, а может и деревянный стол. Поэтому браузеры показывают XML-документы «как есть». Можно задать CSS файлы и для XML-документов, но это не рекомендуется.

Для того, чтобы задать формат отображения XML-документов, используются таблицы стилей XSL. XSL - расширяемый язык стилей (Extensible Stylesheet Language) гораздо более богат возможностями, чем CSS. XSL - больше, чем просто таблица стилей.

Один и тот же файл XML можно связать с разными таблицами XSL, в том числе программно.

XSL состоит из 3 частей:

  1. XSLT - метода преобразования XML-документов
  2. XPath - метода задания частей и путей к элементам XML
  3. XSL Formatting Objects - метода форматирования XML-документов

Самая важная часть XSL - это язык преобразований XSLT (XSL Transformation). Он применяется для преобразования XSL-документов в другие типы документов или другие XSL -документы. Часто XSLT используется для преобразования XSL-документа в формат HTML.

Для того, чтобы создать XSLT-документ, выберите в диалоге создания файла XSLT file. VS 2005 создает каркас таблицы стилей. Так как таблица стилей сама по себе является XML-документом, она начинается с декларации XML.

  <?xml version="1.0" encoding="utf-8"?>

Тег xsl:stylesheet задает начало таблицы стилей.

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

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

  a 
  { 
        font-size:medium; 
        color:Fuchsia; 
  } 

Это правило определяет стиль вывода гиперссылок среднего размера шрифтом фиолетовым цветом.

В XSL используются шаблоны. Для связывания шаблона с XML-элементом используется атрибут соответствия.

Тег xsl:template задает начало шаблона. Атрибут шаблона match="/"> связывает шаблон и корневой элемент исходного XML-документа.

  <xsl:template match="/">
  </xsl:template>

В этот тег вложен шаблон HTML -файла. Комментарий напоминает о том, что туда нужно вставить XSL-элементы.

Создание файлов XSLT рассмотрим на примере. Создайте в папке App_Data файл XML "Quotes.xml"

  <?xml version="1.0" encoding="utf-8" ?> 
  <!-цитаты великих людей --> 
    <Quote> 
      <Text> 
        Хотели как лучше, а получилось как всегда.</Text> 
        <Author>Виктор Черномырдин</Author> 
      </Quote> 
    <Quote> 
      <Text>Америка - континент, названный так потому, что его открыл Колумб.</Text> 
      <Author>Жорж Элгози</Author> 
    </Quote> 
    <Quote> 
      <Text>Я прихожу в бешенство от одной мысли о том, сколько бы я всего узнал, если бы не ходил в школу.</Text> 
      <Author>Джордж Бернард Шоу</Author> 
    </Quote> 
    <Quote> 
      <Text>Многое придумано для того, чтобы не думать.</Text> 
      <Author>Карел Чапек</Author> 
    </Quote> 
    <Quote> 
      <Text>Если скажешь правду, все равно рано или позно попадешься.</Text> 
      <Author>Оскар Уайльд</Author> 
    </Quote> 
    <Quote> 
      <Text>Быть ему президентом, если его до той поры не повесят.</Text> 
      <Author>Марк Твен</Author> 
    </Quote> 
  </Quotes> 

Чтобы внести в выходной поток XSLT-преобразования каждый XML-элемент, применяется тег XSL xsl:for-each. Элемент :for-each определяет местоположение элементов в XML-документе и повторяет шаблон для каждого из них.

      <xsl:for-each select="Quotes/Quote"> </xsl:for-each>

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

Чтобы внести в выходной поток XSLT-преобразования значение XML-элемента, применяется тег XSL xsl:value-of:

      <xsl:value-of select="Text"/>
      <hr/>

Данные можно отсортировать с помощью тега xsl:sort, который должен находиться внутри элемента xsl:for-each:

      <xsl:sort select="Author" />

XSL может применять условия для показа и форматирования информации в зависимости от значений элементов. «Условный оператор» имеет вид <xsl:choose>, в который вложены элементы <xsl:when> и возможно, <xsl:otherwise>. Условие задается в элементе <xsl:when> с помощью парамерта test:

      <xsl:choose> 
        <xsl:when test="Author='Марк Твен'"> 
          <img src="http://www.tvkultura.ru/p/q_14406.jpg"></img> 
            </xsl:when> 

Окончательный вид файла трансформации:

  <?xml version="1.0" encoding="utf-8"?> 
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:template match="/"> 
      <html> 
        <body> 
          <h1 style="background-color: RoyalBlue; color: white; 
             font-size: 24pt; text-align: center; letter-spacing: 1.0em"> 
            Известные цитаты 
          </h1> 
          <table border="0"> 
            <tr style="font-size: 12pt; font-family: verdana; 
              font-weight: bold"> 
              <td style="text-align: center">Цитата</td> 
              <td style="text-align: center">Автор</td> 
            </tr> 
            <xsl:for-each select="Quotes/Quote"> 
              <xsl:sort select="Author" /> 
              <tr style="font-size: 10pt; font-family: verdana"> 
                <td> 
                  <xsl:value-of select="Text"/></td> 
                <td> 
                  <xsl:choose> 
                    <xsl:when test="Author='Марк Твен'"> 
                      <img src="http://www.tvkultura.ru/p/q_14406.jpg"></img> 
                    </xsl:when> 
                    <xsl:otherwise> 
                    <i><xsl:value-of select="Author"/></i> 
                    </xsl:otherwise> 
                  </xsl:choose> 
                </td> 
              </tr> 
            </xsl:for-each> 
          </table> 
        </body> 
      </html> 
    </xsl:template> 
  </xsl:stylesheet> 

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

  <?xml-stylesheet type="text/xsl" href="XSLTFile.xsl"?>,

или выберите в меню XML пункт Show XML Output и определите файл преобразования.

Тот же самый XML-документ можно преобразовать с помощью другого XSL-файла:

  <?xml version="1.0" encoding="utf-8"?> 
  <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  <xsl:template match="/"> 
      <html> 
      <body> 
        <h1 style="background-color: Brown; color: white; 
             font-size: 24pt; text-align: center; letter-spacing: 1.0em"> 
          Мастера Афоризма 
        </h1> 
        <xsl:for-each select="Quotes/Quote"> 
            <xsl:value-of select="Text"/> 
          <br/> 
            <xsl:value-of select="Author"/> 
          <hr width="70%"/>  </xsl:for-each> 
      </body> 
      </html> 
  </xsl:template> 
  </xsl:stylesheet> 

В результате будет выводиться цитаты, разделенные горизонтальной линией.

Файлы определения схемы документа

Согласно современному стандарту, валидный документ должен соответствовать связанному с ним файлу XSD (XML Schema Definition) - файлу определения схемы XML, который определяет конкретный язык, то есть описывает, какие элементы и типы могут появляться в документе. Схемы XSD призваны заменить DTD (Document Type Definition), разница между ними заключается в том, что файлы XSD сами тоже используют синтаксис XML. Схемы XSD позволяют определить, какие теги разрешены, обязательны они или нет, могут ли повторяться в документе и так далее. Таким образом, XML описывает данные, а XSD - структуру этих данных, или метаданные. В терминах программирования, XSD - описание типов, в то время как в XML-файле описаны объекты этих типов. По адресу http://www.w3.org/TR/2003/WD-xmlschema-11-req-20030121/ находится рабочий проект стандарта XSD 1.1.

Файл описания схемы начинается с описания префикса пространства имен, который включается затем во все элементы этого файла. Адрес http://tempuri.org предназначается для задания URI для пространств имен ASP.NET .

  <xs:schema id="XMLSchema2" targetNamespace="http://tempuri.org/XMLSchema2.xsd"  
             elementFormDefault="qualified"  
    xmlns="http://tempuri.org/XMLSchema2.xsd"  
    xmlns:mstns="http://tempuri.org/XMLSchema2.xsd"  
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

Создавая схемы XSD, можно

  1. декларировать элементы и атрибуты

      <xs:element name="Author" type="xs:string" default="Пушкин" minOccurs="1" maxOccurs="1" />

Например, это определение задает, что элемент "Author" строкового типа, должен появляться один и только один и раз, и если он не указан, то принимает значение "Пушкин".

          <xs:element name="Child" type=" xs:string" maxOccurs="unbounded"/>

Параметр maxOccurs="unbounded" указывает, что элемент может встречаться любое количество раз.

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

  1. определить простые и сложные типы.

В XSD есть предопределенные типы - примерно такие же, как в .NET. Во время работы приложения они преобразуются в типы .NET. На их основании можно строить сложные типы, похожие на структуры языков программирования. Сложный тип состоит из последовательности описаний элементов. Определим сложный тип

    <xs:complexType name="Quote"> 
      <xs:sequence> 
        <xs:element name="Text" type="xs:string" minOccurs="1" maxOccurs="1" /> 
        <xs:element name="Author" type="xs:string" default="Пушкин" minOccurs="1" maxOccurs="1" /> 
      </xs:sequence> 
    </xs:complexType>  

Тег <xs:sequence> определяет, что элементы в данном типе должны появляться в заданном порядке. Если бы использовался тег <xs:all>, то элементы могли бы появляться в любом порядке.

Тег <xs:choice> похож на структуру с вариантами. Он определяет, что в элементе данног типа должен быть только один из вложенных элементов.

  <xs:complexType name="StateProvinceType">
    <xs:choice>
      <xs:element name="State" type="xs:string"/>
      <xs:element name="Province" type="xs:string"/>
    </xs:choice>
  </xs:complexType>

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

Глобальный тип можно использовать в определении элементов.

      <xs:element name="Quote" type="Quote" maxOccurs="unbounded" />

В следующем примере определен простой тип, вложенный в определение элемента MyValue.

  <xs:element name="MyValue" type="MyInteger"/>
    <xs:simpleType name="MyInteger">
      <xs:restriction base="xs:positiveInteger">
        <xs:minInclusive value="1"/>
        <xs:maxInclusive value="10"/>
      </xs:restriction>
    </xs:simpleType>  

Значениями этого типа могут быть целые положительные числа от 1 до 10.

Простой тип может быть перечислением:

    <xs:simpleType name="Answers"> 
      <xs:restriction base="xs:string"> 
        <xs:enumeration value="yes"> 
        </xs:enumeration> 
        <xs:enumeration value="no" /> 
        <xs:enumeration value="don't know" /> 
      </xs:restriction> 
    </xs:simpleType> 
  1. Добавлять новые группы и группы атрибутов.

В определении сложного типа могут фигурировать атрибуты. Предположим, мы хотим построить схему такого файла:

  <?xml version="1.0" encoding="utf-8" ?> 
  <FilmChoices> 
    <Film Title='Броненосец "Потемкин"'> 
      <Year>1925</Year> 
      <Director>Эйзенштейн</Director></Film> 
    <Film Title="Война и мир"> 
      <Year>1967</Year> 
      <Director>Сергей Бондарчук</Director> </Film> 
    <Film Title ="Пятая рота"> 
      <Year>2005</Year> 
      <Director>Федор Бондарчук</Director> </Film> 
  </FilmChoices> 

Необходимо потребовать наличие атрибута Title:

      <xs:attribute name="Title" type="xs:string"  use="required"/>

Атрибуты могут быть только простых типов.

  1. Добавлять аннотации.

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

    <xs:complexType name="Quote"> 
      <xs:annotation> 
        <xs:documentation> 
          Цитаты разных авторов 
        </xs:documentation> 
      </xs:annotation> 

<xs:documentation> предназначается для читателей файла, а <xs:appinfo> для обрабатывающих файл программ.

Полное описание синтаксиса XSD можно прочитать по адресу http://www.w3.org/2001/XMLSchema.xsd

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

Класс XmlReader

С помощью класса XmlReader можно быстрее, чем другими методами, получить данные из XML-документов.

XmlReader - это абстрактный класс. Чтобы начать чтение, в статический метод Create передается объект класса XmlReaderSettings. Эта функция подсчитывает число узлов в документе.

  using System.Xml; 
  using System.IO; 
      private int CountNodes(string xmlFile) 
      { 
          int NodesCount=0; 
          XmlReaderSettings settings = new XmlReaderSettings(); 
          settings.IgnoreWhitespace = true; 
          settings.IgnoreComments = true; 
          using (XmlReader reader = XmlReader.Create(xmlFile, settings)) 
          { 
              while (reader.Read()) 
              { 
                  if (reader.NodeType == XmlNodeType.Element) 
                  { 
                      NodesCount++; 
                  } 
              } 
          } 
          return NodesCount; 
      }  

Класс XmlReader позволяет извлекать из документа классы CLR. Пусть у нас есть меню ресторана.

  <?xml version="1.0"?> 
  <pizza_menu> 
    <food name="Пицца Грандиозо"> 
      <price>450.00</price> 
      <description>Грибы, бекон, салями, ветчина, 
      баварские сосиски, артишоки, 
      высушенные на солнце помидоры, 
      сыр Пармезан </description> 
      <calories>700</calories> 
    </food> 
    <food name="Прэго пицца"> 
      <price>306.00</price> 
      <description> 
        Кусочки нежной куриной грудки в соусе Песто, 
        красный сладкий перец, грибы, 
        кукуруза, сыр Пармезан 
      </description> 
      <calories>650</calories> 
    </food> 
    <food name="Пицца Маргарита"> 
      <price>126.00</price> 
      <description> 
        Классическая итальянская пицца 
        подается на выбор с базиликом 
        или без базилика 
      </description> 
      <calories>600</calories> 
    </food> 
  </pizza_menu>  

Напишем функцию, которая посчитает сумму цен и количества калорий в меню.

      protected void Page_Load(object sender, EventArgs e) 
      { 
          int ItemsCount = 0; 
          decimal DishesTotal = 0; 
          UInt16 CaloriesTotal = 0; 
          XmlReaderSettings settings = new XmlReaderSettings(); 
          settings.IgnoreWhitespace = true; 
          NameTable nt = new NameTable(); 
          object food = nt.Add("food"); 
          object price = nt.Add("price"); 
          object calories = nt.Add("calories"); 
          settings.NameTable = nt; 
          string MenuFile = Path.Combine(Request.PhysicalApplicationPath, "menu.xml"); 
          using (XmlReader reader = XmlReader.Create(MenuFile, settings)) 
          { 
              while (reader.Read()) 
              { 
                  if (reader.NodeType == XmlNodeType.Element &&  
                      food.Equals(reader.LocalName)) 
                  { 
                      ItemsCount++; 
                  } 
                  if (reader.NodeType == XmlNodeType.Element &&  
                      price.Equals(reader.LocalName)) 
                  { 
                      DishesTotal += 
                      (UInt16)reader.ReadElementContentAsDecimal(); 
                  } 
                  if (reader.NodeType == XmlNodeType.Element && 
                  calories.Equals(reader.LocalName)) 
                  { 
                      CaloriesTotal += 
                      (UInt16)reader.ReadElementContentAsInt(); 
                  } 
              } 
          } 
          Response.Write(String.Format("Вы заказали {0} блюда на сумму {1:C}, {2} калорий", 
          ItemsCount, DishesTotal, CaloriesTotal)); 
      } 

Класс XPathDocument

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

Возьмем XML-документ "Quotes.xml"и файл трансформации XSL "Quotes.xsl". В выходной поток страницы будет направлен результат преобразования XML-документа.

      <% 
          XPathDocument doc = 
            new XPathDocument(Server.MapPath("App_Data\\Quotes.xml")); 
                XslCompiledTransform xsl = new XslCompiledTransform(); 
                xsl.Load(Server.MapPath("App_Data\\Quotes.xsl")); 
                xsl.Transform(doc, null, Response.OutputStream); %>  

Благодаря тому, что в файле трансформации определены табличные теги, на странице появится таблица с нужной информацией.

Элемент управления XML

Элемент управления XML предоставляет способ преобразовать XML-документ, используя таблицу стилей XSL. Свойство DocumentSource позволяют задать XML-файл, в котором находятся данные, TransformSource - файл трансформации XSLT.

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

      <asp:Xml ID="Xml1" runat="server" DocumentSource="~/App_Code/Quotes.xml" TransformSource="~/App_Data /Quotes.xsl"></asp:Xml>

XMLDataSource

Элемент -источник данных XMLDataSource обеспечивает простой способ подключения XML-документов как источников данных к элементам, отображающим информацию. Также можно задать запрос XPath для того, чтобы отфильтровать данные. Как и SqlDataSource, он позволяет редактировать, удалять, добавлять записи данных. Для этого нужно получить доступ к находящемуся в нем объекту XmlDataDocument с помощью вызова метода GetXmlDocument. После редактирования документ сохраняется с помощью метода Save.

В отличие от табличных данных в СУБД, данные в XML-файлах иерархичны, поэтому XMLDataSource удобно привязывать к иерархичным элементам управления, например Menu.

Синтаксис привязки к данным XML

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

Эти методы работают так же, как Bind и Eval, которые обсуждались в 7 лекции.

      <% XPathBinder.Eval(Container.DataItem, "name"); %>

Как и при связывании с помощью SQLDataSource, можно сокращенно писать

      <%# XPath("name")%>

Так же, как и у DataBinder, метод Eval класса XPathBinder поддерживает строки форматирования:

      <% XPath("employees/employee/HireDate", "{0:mm dd yyyy}") %>

Применим этот синтаксис в элементе DataList, который получает данные из источника данных XmlDataSource:

  <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/nobel.xml" XPath="//nobel/literature/writer"> 
  </asp:XmlDataSource> 
  <asp:DataList ID="DataList1" DataSourceID="XmlDataSource1" runat="server"> 
      <ItemTemplate> 
           <p> 
               <%# XPath("name")%>  получил премию по литературе в 
               <%# XPath("winningdate")%> 
               за произведение <%# XPath("work")%></b> 
          </p> 
      </ItemTemplate> 
  </asp:DataList> 

Заключение

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


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=5830