2009-12-01 73 views
5

我正在查詢Twitter RSS源並將結果提供給Repeater進行顯示。我只想獲得XPath查詢的前5個結果。有沒有辦法在XPath語法中做到這一點,或者我是否必須遍歷結果XmlNodeList以取出前5個?從XmlDocument XPath查詢中獲取特定數量的結果

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(); 

回答

9

試試這個XPath查詢來代替:

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

它只返回的第一個五年匹配的項目。括號非常重要,因爲如果沒有它們,[position() <= 5]部分適用於item元素在其父級中的位置,而不適用於其在結果節點集中的位置。

+0

這正是我需要在我目前的狀況。謝謝! – 2009-12-01 16:53:33

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!

...並看看辛迪加處理RSS源的API更容易。然後,如果您只需要5個項目,請使用LINQ方法採集集合以獲取特定數量的項目。

這將讓你表達自己更好,不用擔心飼料的結構,命名空間等

我知道這並不直接回答你的問題,但很多人不知道這些.NET中的新API我想我會在這裏提到它們。

所以,你的代碼得到的只是5個項目將是這樣的......

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

馬丁,謝謝!這是一個很好的選擇,我想我會更頻繁地使用它。我不確定我的客戶端服務器是否是3.5,所以我現在遠離LINQ,但如果我發現他們有它,我會使用它。我只是在本地嘗試它,它像一個魅力。我喜歡擁有RSS節點的實際屬性。 – 2009-12-01 16:55:31