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

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

Жанры

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
):

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

Моя (не) на одну ночь. Бесконтрактная любовь

Тоцка Тала
4. Шикарные Аверины
Любовные романы:
современные любовные романы
7.70
рейтинг книги
Моя (не) на одну ночь. Бесконтрактная любовь

Матабар IV

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

Большие Песцовые радости

Видум Инди
8. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.25
рейтинг книги
Большие Песцовые радости

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10

Страж Тысячемирья

Земляной Андрей Борисович
5. Страж
Фантастика:
боевая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Страж Тысячемирья

Становление

Демидов Джон
2. Система компиляции
Фантастика:
героическая фантастика
рпг
5.00
рейтинг книги
Становление

Гримуар темного лорда VI

Грехов Тимофей
6. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VI

Ложная девятка 2

Риддер Аристарх
2. 4-4-2
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ложная девятка 2

Бастард Императора. Том 13

Орлов Андрей Юрьевич
13. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 13

Развод с генералом драконов

Солт Елена
Фантастика:
фэнтези
5.00
рейтинг книги
Развод с генералом драконов

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6