Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

private void button1_Click(object sender, System.EventArgs e) {

 //изменить в соответствии со структурой путей доступа

 XPathDocument doc=new XPathDocument("..\\..\\..\\booksxpath.XML");

 //создать XPathNavigator

 XPathNavigator nav=((IXPathNavigable)doc).CreateNavigator;

 //создать XPathNodeIterator узлов book,

 // которые имеют novel значением атрибута genre

 XPathNodeIterator iter=nav.Select("/bookstore/book[@genre="novel']");

 while(iter.MoveNext) {

LoadBook(iter.Current.Clone);

 }

 //
добавим разделительную линию и вычислим сумму

 listBox1.Items.Add("========================");

 listBox1.Items.Add("Total Cost = "

+ nav.Evaluate("sum(/bookstore/book[@genre='novel']/price)"));

}

При этом вывод изменится следующим образом:

XslTransform

Пространство имен

System.Xml.Xsl
содержит классы XSL, применяемые .NET.
XslTransform
может использоваться с любым хранилищем, которое реализует интерфейс
IXPathNavigable
. В настоящее время на платформе .NET это:
XmlDocument
,
XmlDataDocument
и
XPathDocument
. Так же как и в случае XPath, воспользуйтесь тем хранилищем, которое подходит лучшим образом. Если планируется создание заказного хранилища, такого как файловая система, и желательно иметь возможность выполнять преобразования, не забудьте реализовать в классе интерфейс
IXPathNavigable
.

XslTransform
основывается на потоковой модели запросов. В связи с этим можно соединить несколько преобразования вместе. Можно даже применять, если нужно, между преобразованиями заказной объект чтения. Это предоставляет большую гибкость при проектировании.

В первом примере, который мы рассмотрим, берется документ

books.xml
и преобразуется в простой документ HTML для вывода. (Этот код можно найти в папке
XPathXSLSample3
.) Необходимо будет добавить следующие операторы
using
:

using System.IO;

using System.Xml.Xsl;

using System.Xml.XPath;

Вот код, выполняющий преобразование:

private void button1_Click(object sender System.EventArgs e) {

 //создать новый XPathDocument

 XPathDocument doc=new XPathDocument("..\\..\\..\\booksxpath.XML");

 // создать новый XslTransForm

 XslTransform transForm=new XslTransform;

 transForm.Load("..\\..\\..\\books.xsl");

 // этот FileStream будет нашим выводом

 FileStream fs=new FileStream("..\\..\\..\\booklist.html", FileMode.Create);

 // Создать Navigator

 XPathNavigator nav=((IXPathNavigable)doc).CreateNavigator;

 // Выполнить преобразование. Файл вывода создается здесь.

 transForm.Transform(nav, null, fs);

}

Сделать

это преобразование проще почти невозможно. Сначала создается объект на основе
XPathDocument
и объект на основе
XslTransform
. Затем файл
bookspath.xml
загружается в
doc
, a
books.xsl
в
transForm
. В этом примере для записи нового документа HTML на диск создается объект
FileStream
.

Если бы это было приложение ASP.NET, мы использовали бы объект

TextWriter
и передавали бы его в объект
HttpResponse
. Если бы мы преобразовывали в другой документ XML, то применялся бы объект на основе
XmlWriter
. После того как объекты
XPathDocument
и
XslTransform
будут готовы, мы создаем
XPathNavigator
на
doc
и передаем
nav
и этот
stream
в метод
Transform
объекта
transForm
.
XslTransform
имеет несколько перегружаемых версий, получающих комбинации навигаторов,
XsltArgumentList
(подробнее об этом позже) и потоков ввода/вывода. Параметром навигатора может быть
XPathNavigator
или любой объект, реализующий интерфейс
IXPathNavigable
. Потоки ввода/вывода могут быть
TextWriter
,
Stream
или объектом на основе
XmlWriter
.

Документ

books.xsl
является таблицей стилей. Документ выглядит следующим образом:

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

 <xsl:template match="/">

<html>

<head>

<title>Price List</title>

</head>

<body>

<table>

<xsl:apply-templates/>

</table>

</body>

</html>

 </xsl:template>

 <xsl:template match="bookstore">

<xsl:apply-templates select= "book"/>

 </xsl:template>

 <xsl:template match="book">

<tr><td>

<xsl:value-of select="title"/>

</td><td>

<xsl:value-of select="price"/>

</td></tr>

 </xsl:template>

</xsl:stylesheet>

Ранее упоминался объект

XsltArgumentList
. Это способ, которым можно объект с методами связать с пространством имен. Когда это сделано, можно вызывать методы во время преобразования. Рассмотрим пример, чтобы понять, как это работает (находится в
XPathXSLSample4
):

Поделиться:
Популярные книги

Как я строил магическую империю 3

Зубов Константин
3. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 3

Ритуал для призыва профессора

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Ритуал для призыва профессора

Невеста снежного демона

Ардова Алиса
Зимний бал в академии
Фантастика:
фэнтези
6.80
рейтинг книги
Невеста снежного демона

Прорвемся, опера! Книга 3

Киров Никита
3. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера! Книга 3

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Мымра!

Фад Диана
1. Мымрики
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мымра!

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Офицер Красной Армии

Поселягин Владимир Геннадьевич
2. Командир Красной Армии
Фантастика:
попаданцы
8.51
рейтинг книги
Офицер Красной Армии

Волхв пятого разряда

Дроздов Анатолий Федорович
2. Ледащий
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Волхв пятого разряда

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Младший сын князя. Том 3

Ткачев Андрей Юрьевич
3. Аналитик
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Младший сын князя. Том 3

Шахта Шепчущих Глубин, Том II

Астахов Евгений Евгеньевич
3. Виашерон
Фантастика:
фэнтези
7.19
рейтинг книги
Шахта Шепчущих Глубин, Том II

Наследник пепла. Книга I

Дубов Дмитрий
1. Пламя и месть
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник пепла. Книга I

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9