关于ASP.NET:从xmldocument xpath查询中获取特定数量的结果

Get a specific number of results from an XmlDocument XPath query

我正在查询Twitter的RSS提要,并将结果提供给中继器进行显示。我只想得到xpath查询的前5个结果。在xpath语法中,有没有一种方法可以做到这一点,或者我需要循环生成的XmlNodeList以拉出前5个?

1
2
3
4
5
6
7
8
9
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();


请尝试此xpath查询:

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

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


如果您想继续使用xpath,那么应该查看xpath中的position()方法。使用类似这样的谓词…

1
[position() < 6]

…结果应将结果限制在前5项。韦尔博格的答案是你在这里最好的参考(+1到韦尔博格)。

但是,如果你能使用.NET 3.5,那么我建议你看看我的答案…

在10行以下的简单代码中,您能做的最酷的事情是什么?帮助我激励初学者!

…再看一看联合API,它使处理RSS提要更加容易。然后,如果您只需要5个项目,请使用Linq方法接受集合以获取特定数量的项目。

这将允许您更好地表达自己,而不必担心提要、名称空间等的结构。

我意识到这并不是直接回答你的问题,但是因为很多人不知道.NET中的这些新API,所以我想我会在这里提到它们。

所以,你得到5个项目的代码是这样的…

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