从XmlDocument XPath查询中获取特定数量的结果

时间:2009-12-01 16:33:54

标签: asp.net xpath xmldocument

我正在查询Twitter RSS提要并将结果提供给Repeater进行显示。我只想获得XPath查询的前5个结果。有没有办法在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 个答案:

答案 0 :(得分:9)

请尝试使用此XPath查询:

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

仅返回前五个匹配项。括号很重要,因为如果没有它们,[position() <= 5]部分将应用于item元素在其父级中的位置,而不是它在结果节点集中的位置。

答案 1 :(得分:8)

如果要继续使用xpath,则应该查看xpath中的position()方法。使用这样的谓词...

[position() < 6]

...应该导致结果仅限于前5个项目。 Welbog的答案是你最好的参考(+1给Welbog)。

然而,如果您能够使用.NET 3.5,那么我建议您在这里查看我的答案...

What is the coolest thing you can do in <10 lines of simple code? Help me inspire beginners!

...并查看联合API,以便更轻松地处理RSS提要。然后,如果您只需要5个项目,请使用LINQ方法接受集合以获取特定数量的项目。

这样可以让您更好地表达自己,而不必担心Feed,命名空间等的结构。

我意识到这不是直接回答你的问题,但是很多人不了解.NET中的这些新API,我想我会在这里提到它们。

所以,你只获得5个项目的代码就是这样......

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