5

我正在查询 Twitter RSS 提要并将结果提供给中继器进行显示。我只想获得 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();
4

2 回答 2

10

试试这个 XPath 查询:

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

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

于 2009-12-01T16:36:22.743 回答
8

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

[position() < 6]

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

但是,如果您能够使用 .NET 3.5,那么我建议您在此处查看我的答案...

用不到 10 行的简单代码,你能做的最酷的事情是什么?帮助我启发初学者!

...并查看使处理 RSS 提要更容易的联合 API。然后,如果您只想要 5 个项目,请使用 LINQ 方法 Take on the collection 来获取特定数量的项目。

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

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

因此,您仅获取 5 个项目的代码将是这样的......

var xmlr = XmlReader.Create("http://twitter.com/statuses/public_timeline.rss")
var first5Items = SyndicationFeed
                    .Load(xmlr)
                    .GetRss20Formatter()
                    .Feed
                    .Items
                    .Take(5);  
于 2009-12-01T16:36:50.310 回答