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

6

我正在查询 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个回答

11

尝试使用这个XPath查询:

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

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


这正是我在当前情况下所需要的。谢谢! - Mark Ursino

8

如果你想继续使用xpath,那么你应该查看xpath中的position()方法。使用类似于以下的谓词...

[position() < 6]

...应该将结果限制为仅前5个项目。Welbog的答案是你最好的参考(+1到Welbog)。

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

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

...并查看使处理RSS提要更加容易的聚合API。然后,如果您只想要5个项目,请在集合上使用LINQ方法Take以取得特定数量的项目。

这将使您能够更好地表达自己,而不必担心提要的结构、命名空间等。

我意识到这并没有直接回答您的问题,但由于许多人不知道.NET中的这些新API,因此我在这里提到它们。

所以,获取只有5个项目的代码将类似于这样...

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

马丁,谢谢!这是一个很好的替代方案,我想我会更经常地使用它。我不确定我的客户服务器是否是3.5,所以现在我正在避免使用LINQ,但如果我发现他们有它,我会使用它。我刚刚在本地尝试了一下,它像魔法一样工作。我喜欢拥有RSS节点的实际属性。 - Mark Ursino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接