2009-12-01 23 views
5

Tôi đang truy vấn nguồn cấp dữ liệu RSS của Twitter và cung cấp kết quả vào Bộ lặp để hiển thị. Tôi muốn chỉ nhận được 5 kết quả đầu tiên của truy vấn XPath. Có cách nào để làm điều đó trong cú pháp XPath hay tôi phải lặp qua kết quả XmlNodeList để kéo ra 5 đầu tiên?Nhận số lượng kết quả cụ thể từ truy vấn XPath XmlDocument

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

Trả lời

9

Hãy thử truy vấn XPath này thay vì:

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

Nó chỉ trả về đầu tiên năm mục thoả mãn. Các dấu ngoặc đơn là quan trọng, vì không có chúng, phần [position() <= 5] áp dụng cho vị trí của phần tử item trong phần tử gốc của nó thay vì vị trí của nó trong tập hợp nút kết quả.

+0

Đây chính là những gì tôi cần trong tình hình hiện tại của tôi. Cảm ơn! –

8

Nếu bạn muốn tiếp tục sử dụng xpath thì bạn nên xem phương thức position() trong xpath. Sử dụng một vị ngữ như thế này ...

[position() < 6] 

... nên kết quả giới hạn kết quả chỉ với 5 mục đầu tiên. Câu trả lời của Welbog là tài liệu tham khảo tốt nhất của bạn ở đây (+1 cho Welbog).

Tuy nhiên, nếu bạn có thể sử dụng .NET 3.5 thì tôi sẽ khuyên bạn nên nhìn vào câu trả lời của tôi ở đây ...

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

... và hãy nhìn vào những cung cấp thông tin API giúp xử lý nguồn cấp dữ liệu RSS dễ dàng hơn nhiều. Sau đó, nếu bạn chỉ muốn 5 mục, sử dụng phương thức LINQ Đi trên bộ sưu tập để lấy số lượng mục cụ thể.

này sẽ cho phép bạn thể hiện bản thân tốt hơn và không phải lo lắng về cấu trúc của thức ăn, không gian tên, vv

Tôi nhận ra điều này là không trực tiếp trả lời các câu hỏi của bạn nhưng càng nhiều người không biết về các API mới này trong .NET Tôi nghĩ tôi sẽ đề cập đến chúng ở đây.

Vì vậy, mã của bạn để nhận được chỉ là 5 mặt hàng sẽ là một cái gì đó như thế này ...

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

Martin, cảm ơn! Đây là một lựa chọn tuyệt vời và tôi nghĩ rằng tôi sẽ sử dụng nó thường xuyên hơn. Tôi không chắc liệu máy chủ của khách hàng của tôi có phải là 3,5 vì vậy tôi không ở lại LINQ ngay bây giờ nhưng nếu tôi biết họ có nó, tôi sẽ sử dụng nó. Tôi chỉ thử nó ở địa phương và nó hoạt động như một sự quyến rũ. Tôi thích có các thuộc tính thực sự cho các nút RSS. –

Các vấn đề liên quan