"Язык — не сын, а отец мысли."
Оскар Уайльд
Аббревиатура
Давайте поймем главное отличие
Стандарт требует, чтобы программа, которая обрабатывает XML-документ, останавливала работу, когда обнаружит ошибку. А если браузер обнаружит непонятный тег в HTML или отсутствие закрывающего тега, он это просто игнорирует.
В начале XML-документа обязательно появляется его декларация, или пролог. В нем указывается версия стандарта
<?xml version="1.0" encoding="utf-8" ?>
Декларация не является частью XML-документа и не имеет закрывающего тега. В тексте XML-файла могут находиться комментарии в стиле HTML — <!--text -->.
XML-документ может иметь только один корневой элемент. В него могут быть вложены другие узлы, а в них, в свою очередь, — другие. Каждому открывающему тегу
<b><i>Какой-то текст</b></i>
является ошибкой в
У тегов могут быть атрибуты. Значения атрибутов должны быть заключены в кавычки. Порядок атрибутов значения не имеет. Между открывающим и закрывающим тегами может находиться текст. В
<PROPERTY Label="ogl_extension" Value="4520" Itemtype="predefined" />
Это краткая форма тега
<PROPERTY Label="ogl_extension" Value="4520" Itemtype="predefined"></PROPERTY>
Вам это ничего не напоминает? Правила описания элементов ASP .NET точно такие же.
Существует атрибут xmlns, который определяет пространство имен. Значением его может быть любое уникальное имя. Существует договоренность использовать URL, так как они уникальны. Пространства имен имеют смысл, аналогичный их применению в .NET Framework — чтобы не смешивать одинаковые имена, используемые разными разработчиками. Название пространства имен отделяется от имени двоеточием.
XML-файлы представляют иерархическую информацию, которую можно представить в виде дерева с одним корнем.
Документы
Браузеры 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-документов прямо во время редактирования.
Элемент управления 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 (он называется
<?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 можно было работать только с файлами ImageUrlField, NavigateUrlField и AlternateTextField:
<asp:AdRotator ID="AdRotator2" runat="server" DataSourceId="SqlDataSource1" AlternateTextField="Alternate" ImageUrlField="Image" NavigateUrlField="NavigateUrl" />
Известно, что для форматирования HTML-файлов часто используются CSS (Cascading Stylesheets), хотя это необязательно, так как браузеры соотносят со всеми тегами определенный внешний вид. Элемент <p> задает параграф, <B> — полужирный шрифт; браузер знает, как их показывать.
Поскольку <table> может означать таблицу HTML, а может и деревянный стол. Поэтому браузеры показывают XML-документы "как есть". Можно задать CSS-файлы и для XML-документов, но это не рекомендуется.
Для того чтобы задать формат отображения XML-документов, используются таблицы стилей
Один и тот же файл
XSLT - метод преобразования XPath - метод задания частей и путей к элементам XSL Formatting Object - метод форматирования Самая важная часть
Для того чтобы создать
<?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:template задает начало шаблона. Атрибут шаблона match="/"> связывает шаблон и корневой элемент исходного XML-документа:
<xsl:template match="/"> </xsl:template>
В этот тег вложен шаблон HTML-файла. Комментарий напоминает о том, что туда нужно вставить XSL-элементы.
Создание файлов
<?xml version="1.0" encoding="utf-8" ?>
<!--цитаты великих людей -->
<Quotes>
<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>
Чтобы внести в выходной поток xsl:for-each. Элемент :for-each определяет местоположение элементов в
<xsl:for-each select="Quotes/Quote"> </xsl:for-each>
Все, что находится в шаблоне, будет выводиться столько раз, сколько в исходном документе встретится элемент Quote, заключенный в тег Quotes.
Чтобы внести в выходной поток xsl:value-of:
<xsl:value-of select="Text"/>
<hr/>
Данные можно отсортировать с помощью тега xsl:sort, который должен находиться внутри элемента xsl:for-each:
<xsl:sort select="Author" />
<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-stylesheet type="text/xsl" href="XSLTFile.xsl"?>,
или выберите в меню
Тот же самый 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>
В результате будут выводиться цитаты, разделенные горизонтальной линией.
Согласно современному стандарту, валидный документ должен соответствовать связанному с ним файлу
Файл описания схемы начинается с описания префикса пространства имен, который включается затем во все элементы этого файла. Адрес 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">
Создавая схемы
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. определить простые и сложные типы.
В
<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> — для обрабатывающих файл программ.
Полное описание синтаксиса
Редактировать IntelliSense даже подставляет теги из этого файла.
С помощью класса
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;
}
Класс
<?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));
}
Класс обеспечивает чтение и хранение в памяти XML-документов для трансформаций с помощью .
Возьмем XML-документ "Quotes.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); %>
Благодаря тому, что в файле трансформации определены табличные теги, на странице появится таблица с нужной информацией.
Элемент управления DocumentSource позволяют задать XML-файл, в котором находятся данные, а TransformSource — файл трансформации
В предыдущем примере того же результата можно достичь, если поставить на странице элемент управления
<asp:Xml ID="Xml1" runat="server" DocumentSource="~/App_Code/Quotes.xml" TransformSource="~/App_Data /Quotes.xsl"></asp:Xml>
XMLDataSource обеспечивает простой способ подключения XML-документов как источников данных к элементам, отображающим информацию. Также можно задать запрос для того, чтобы отфильтровать данные. Как и , он позволяет редактировать, удалять, добавлять записи данных. Для этого нужно получить доступ к находящемуся в нем объекту XmlDataDocument с помощью вызова метода GetXmlDocument. После редактирования документ сохраняется с помощью метода Save.
В отличие от табличных данных в СУБД, данные в XML-файлах иерархичны, поэтому XMLDataSource удобно привязывать к иерархичным элементам управления, например, Menu.
Синтаксис привязки к данным
Так как в приложениях XML-данные используются все чаще и чаще, был введен метод привязки данных, полученных из XMLDataSource.
Эти методы работают так же, как Bind и Eval, которые обсуждались в лекции 7:
<% XPathBinder.Eval(Container.DataItem, "name"); %>
Как и при связывании с помощью , можно сокращенно писать
<%# XPath("name")%>
Так же как и у DataBinder, метод Eval класса XPathBinder поддерживает строки форматирования:
<% XPath("employees/employee/HireDate", "{0:mm dd yyyy}") %>
Применим этот синтаксис в элементе , который получает данные из источника данных 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-документ, останавливала работу, когда обнаружит ошибку. А если браузер обнаружит непонятный тег в HTML или отсутствие закрывающего тега, он это просто игнорирует.
В начале XML-документа обязательно появляется его декларация, или пролог. В нем указывается версия стандарта
<?xml version="1.0" encoding="utf-8" ?>
Декларация не является частью XML-документа и не имеет закрывающего тега. В тексте XML-файла могут находиться комментарии в стиле HTML — <!--text -->.
XML-документ может иметь только один корневой элемент. В него могут быть вложены другие узлы, а в них, в свою очередь, — другие. Каждому открывающему тегу
<b><i>Какой-то текст</b></i>
является ошибкой в
У тегов могут быть атрибуты. Значения атрибутов должны быть заключены в кавычки. Порядок атрибутов значения не имеет. Между открывающим и закрывающим тегами может находиться текст. В
<PROPERTY Label="ogl_extension" Value="4520" Itemtype="predefined" />
Это краткая форма тега
<PROPERTY Label="ogl_extension" Value="4520" Itemtype="predefined"></PROPERTY>
Вам это ничего не напоминает? Правила описания элементов ASP .NET точно такие же.
Существует атрибут xmlns, который определяет пространство имен. Значением его может быть любое уникальное имя. Существует договоренность использовать URL, так как они уникальны. Пространства имен имеют смысл, аналогичный их применению в .NET Framework — чтобы не смешивать одинаковые имена, используемые разными разработчиками. Название пространства имен отделяется от имени двоеточием.
XML-файлы представляют иерархическую информацию, которую можно представить в виде дерева с одним корнем.
Документы
Браузеры 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-документов прямо во время редактирования.
Элемент управления 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 (он называется
<?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 можно было работать только с файлами ImageUrlField, NavigateUrlField и AlternateTextField:
<asp:AdRotator ID="AdRotator2" runat="server" DataSourceId="SqlDataSource1" AlternateTextField="Alternate" ImageUrlField="Image" NavigateUrlField="NavigateUrl" />
Известно, что для форматирования HTML-файлов часто используются CSS (Cascading Stylesheets), хотя это необязательно, так как браузеры соотносят со всеми тегами определенный внешний вид. Элемент <p> задает параграф, <B> — полужирный шрифт; браузер знает, как их показывать.
Поскольку <table> может означать таблицу HTML, а может и деревянный стол. Поэтому браузеры показывают XML-документы "как есть". Можно задать CSS-файлы и для XML-документов, но это не рекомендуется.
Для того чтобы задать формат отображения XML-документов, используются таблицы стилей
Один и тот же файл
XSLT - метод преобразования XPath - метод задания частей и путей к элементам XSL Formatting Object - метод форматирования Самая важная часть
Для того чтобы создать
<?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:template задает начало шаблона. Атрибут шаблона match="/"> связывает шаблон и корневой элемент исходного XML-документа:
<xsl:template match="/"> </xsl:template>
В этот тег вложен шаблон HTML-файла. Комментарий напоминает о том, что туда нужно вставить XSL-элементы.
Создание файлов
<?xml version="1.0" encoding="utf-8" ?>
<!--цитаты великих людей -->
<Quotes>
<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>
Чтобы внести в выходной поток xsl:for-each. Элемент :for-each определяет местоположение элементов в
<xsl:for-each select="Quotes/Quote"> </xsl:for-each>
Все, что находится в шаблоне, будет выводиться столько раз, сколько в исходном документе встретится элемент Quote, заключенный в тег Quotes.
Чтобы внести в выходной поток xsl:value-of:
<xsl:value-of select="Text"/>
<hr/>
Данные можно отсортировать с помощью тега xsl:sort, который должен находиться внутри элемента xsl:for-each:
<xsl:sort select="Author" />
<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-stylesheet type="text/xsl" href="XSLTFile.xsl"?>,
или выберите в меню
Тот же самый 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>
В результате будут выводиться цитаты, разделенные горизонтальной линией.
Согласно современному стандарту, валидный документ должен соответствовать связанному с ним файлу
Файл описания схемы начинается с описания префикса пространства имен, который включается затем во все элементы этого файла. Адрес 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">
Создавая схемы
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. определить простые и сложные типы.
В
<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> — для обрабатывающих файл программ.
Полное описание синтаксиса
Редактировать IntelliSense даже подставляет теги из этого файла.
С помощью класса
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;
}
Класс
<?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));
}
Класс обеспечивает чтение и хранение в памяти XML-документов для трансформаций с помощью .
Возьмем XML-документ "Quotes.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); %>
Благодаря тому, что в файле трансформации определены табличные теги, на странице появится таблица с нужной информацией.
Элемент управления DocumentSource позволяют задать XML-файл, в котором находятся данные, а TransformSource — файл трансформации
В предыдущем примере того же результата можно достичь, если поставить на странице элемент управления
<asp:Xml ID="Xml1" runat="server" DocumentSource="~/App_Code/Quotes.xml" TransformSource="~/App_Data /Quotes.xsl"></asp:Xml>
XMLDataSource обеспечивает простой способ подключения XML-документов как источников данных к элементам, отображающим информацию. Также можно задать запрос для того, чтобы отфильтровать данные. Как и , он позволяет редактировать, удалять, добавлять записи данных. Для этого нужно получить доступ к находящемуся в нем объекту XmlDataDocument с помощью вызова метода GetXmlDocument. После редактирования документ сохраняется с помощью метода Save.
В отличие от табличных данных в СУБД, данные в XML-файлах иерархичны, поэтому XMLDataSource удобно привязывать к иерархичным элементам управления, например, Menu.
Синтаксис привязки к данным
Так как в приложениях XML-данные используются все чаще и чаще, был введен метод привязки данных, полученных из XMLDataSource.
Эти методы работают так же, как Bind и Eval, которые обсуждались в лекции 7:
<% XPathBinder.Eval(Container.DataItem, "name"); %>
Как и при связывании с помощью , можно сокращенно писать
<%# XPath("name")%>
Так же как и у DataBinder, метод Eval класса XPathBinder поддерживает строки форматирования:
<% XPath("employees/employee/HireDate", "{0:mm dd yyyy}") %>
Применим этот синтаксис в элементе , который получает данные из источника данных 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>
В этой лекции мы рассмотрели работу с данными типа
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.