Получить определенное количество результатов из запроса XmlDocument XPath - PullRequest
5 голосов
/ 01 декабря 2009

Я запрашиваю канал RSS в Твиттере и отправляю результаты в репитер для отображения. Я хотел бы получить только первые 5 результатов запроса XPath. Есть ли способ сделать это в синтаксисе XPath или мне нужно перебрать получившийся XmlNodeList, чтобы вытащить первые 5?

XmlDocument doc = new XmlDocument();
XmlTextReader reader = new XmlTextReader(rssPath);
doc.Load(reader);

XmlNodeList items = doc.SelectNodes("/rss/channel/item");

rptTwitter.ItemDataBound += new RepeaterItemEventHandler(rptTwitter_ItemDataBound);
rptTwitter.DataSource = items;
rptTwitter.DataBind();

Ответы [ 2 ]

9 голосов
/ 01 декабря 2009

Попробуйте вместо этого запрос XPath:

(/rss/channel/item)[position() <= 5]

Возвращает только первые пять соответствующих элементов. Скобки важны, так как без них часть [position() <= 5] применяется к позиции элемента item в его родительском элементе, а не к позиции в наборе узлов результатов.

8 голосов
/ 01 декабря 2009

Если вы хотите продолжить использовать xpath, вы должны посмотреть на метод position () в xpath. Используя предикат что-то вроде этого ...

[position() < 6]

... следует ограничить результаты только первыми 5 пунктами. Ответ Велбога - ваша лучшая ссылка здесь (+1 к Велбогу).

Однако , если вы можете использовать .NET 3.5, я бы посоветовал вам посмотреть мой ответ здесь ...

Что самое крутое, что вы можете сделать в <10 строках простого кода? Помоги мне вдохновить начинающих! </a>

... и взгляните на API синдикации, которые значительно облегчают работу с RSS-каналами. Затем, если вы хотите только 5 предметов, используйте метод LINQ Take on the collection, чтобы взять определенное количество предметов.

Это позволит вам лучше выразить себя, и вам не придется беспокоиться о структуре канала, пространствах имен и т. Д.

Я понимаю, что это не дает прямого ответа на ваш вопрос, но многие люди не знают об этих новых API в .NET, и я решил упомянуть их здесь.

Итак, ваш код для получения всего 5 элементов будет выглядеть примерно так ...

var xmlr = XmlReader.Create("http://twitter.com/statuses/public_timeline.rss")
var first5Items = SyndicationFeed
                    .Load(xmlr)
                    .GetRss20Formatter()
                    .Feed
                    .Items
                    .Take(5);  
...