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" />
Файлы определения схемы документа
Согласно современному стандарту, валидный документ должен соответствовать связанному с ним файлу 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 позволяет ссылаться на уже описанный в данном файле глобальный элемент или атрибут, чтобы избежать повторного описания одних и тех же элементов.
2. определить простые и сложные типы.
В 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>
3. добавлять новые группы и группы атрибутов.
В определении сложного типа могут фигурировать атрибуты. Предположим, мы хотим построить схему такого файла:
<?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"/>
Атрибуты могут быть только простых типов.
4. добавлять аннотации.
Аннотации позволяют вставлять описание существующих элементов — таким образом, в файл добавляется документация:
<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 даже подставляет теги из этого файла.
Файлы преобразования документа
Известно, что для форматирования HTML-файлов часто используются CSS (Cascading Stylesheets), хотя это необязательно, так как браузеры соотносят со всеми тегами определенный внешний вид. Элемент <p> задает параграф, <B> — полужирный шрифт; браузер знает, как их показывать.
Поскольку XML не использует изначально заданные теги, их значение может быть каким угодно: <table> может означать таблицу HTML, а может и деревянный стол. Поэтому браузеры показывают XML-документы "как есть". Можно задать CSS-файлы и для XML-документов, но это не рекомендуется.
Для того чтобы задать формат отображения XML-документов, используются таблицы стилей XSL. XSL — расширяемый язык стилей (Extensible Stylesheet Language), он гораздо более богат возможностями, чем CSS. XSL — больше, чем просто таблица стилей.
Один и тот же файл XML можно связать с разными таблицами XSL, в том числе программно.
XSL состоит из трех частей:
XSLT - метод преобразования XML-документов.XPath - метод задания частей и путей к элементам XMLXSL Formatting Object - метод форматирования 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-преобразования каждый 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>
В результате будут выводиться цитаты, разделенные горизонтальной линией.
Элемент управления 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>
Класс 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, set- tings)) { 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, set- tings)) { 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); %>
Благодаря тому, что в файле трансформации определены табличные теги, на странице появится таблица с нужной информацией.
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 предоставляет универсальный способ для описания и обмена структурированной информацией, независимо от приложений и разработчиков. На этом мы завершили рассмотрение работы с источниками данных.