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
):
Поделиться:
Популярные книги
Идеальный мир для Лекаря 15
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Младший сын князя
1. Аналитик
Фантастика:
фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Попала, или Кто кого
Любовные романы:
современные любовные романы
5.88
рейтинг книги
Имперец. Том 4
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Газлайтер. Том 5
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Путь Шедара
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Последний Паладин. Том 4
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возрождение Феникса. Том 1
1. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.79
рейтинг книги
Я все еще не князь. Книга XV
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Чужая дочь
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Черный Маг Императора 6
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
В теле пацана
1. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00