C# для профессионалов. Том II | страница 22
— возвращает целое число, соответствующее текущей позиции
□ >MoveNext — перемещает в следующий узел, соответствующий выражению >Xpath, которое создало >XPathNodeIterator
Можно использовать также существующие методы >SelectAncestors и >SelectChildren. Они возвращают >XPathNodelterator. В то время, как >Select получает выражение >XPath в качестве параметра, другие методы выбора получают в качестве параметра >XPathNodeType. В рассматриваемом примере мы выбираем все узлы >XPathNodeType.Element.
Вот как выглядит экран после выполнения кода. Обратите внимание, что все перечисленные книги являются романами (novel).
Для добавления стоимости книг >XPathNavigator содержит метод >Evaluate. >Evaluate имеет три перегружаемые версии. Первая из них содержит строку, которая является вызовом функции >XPath. Вторая перегружаемая версия Evaluate использует в качестве параметра объект >XPathExpression, третья — >XPathExpression и >XPathNodeIterator. Сделаем следующие изменения в примере (эту версию кода можно найти в >XPathXSLSample2):
>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)"));
>}
При этом вывод изменится следующим образом:
Пространство имен >System.Xml.Xsl содержит классы XSL, применяемые .NET. >XslTransform может использоваться с любым хранилищем, которое реализует интерфейс >IXPathNavigable. В настоящее время на платформе .NET это: >XmlDocument, >XmlDataDocument и >XPathDocument. Так же как и в случае XPath, воспользуйтесь тем хранилищем, которое подходит лучшим образом. Если планируется создание заказного хранилища, такого как файловая система, и желательно иметь возможность выполнять преобразования, не забудьте реализовать в классе интерфейс >IXPathNavigable.
>XslTransform основывается на потоковой модели запросов. В связи с этим можно соединить несколько преобразования вместе. Можно даже применять, если нужно, между преобразованиями заказной объект чтения. Это предоставляет большую гибкость при проектировании.