C# 阅读多个RSS源
我目前正在尝试在WindowsPhone7上创建一个小的RSS阅读器应用程序 到目前为止,我能够在不同的全景图上显示单个提要,而且效果很好 然而,在我的主页上,我想显示来自多个RSS源的最新新闻 例如,我在不同的页面上有feed1和feed2,我想在我的主页上显示来自feed1和feed2(或更多)的最新新闻的标题 这是我一直在使用的代码 已加载主页面\u:C# 阅读多个RSS源,c#,silverlight,linq,windows-phone-7,C#,Silverlight,Linq,Windows Phone 7,我目前正在尝试在WindowsPhone7上创建一个小的RSS阅读器应用程序 到目前为止,我能够在不同的全景图上显示单个提要,而且效果很好 然而,在我的主页上,我想显示来自多个RSS源的最新新闻 例如,我在不同的页面上有feed1和feed2,我想在我的主页上显示来自feed1和feed2(或更多)的最新新闻的标题 这是我一直在使用的代码 已加载主页面\u: WebClient wc = new WebClient(); wc.DownloadStringAsync(new Uri("feed-
WebClient wc = new WebClient();
wc.DownloadStringAsync(new Uri("feed-goes-here"));
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
然后:
void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null) return;
XElement xmlItems = XElement.Parse(e.Result);
listBox1.ItemsSource = from x in xmlItems.Descendants("item")
where x.Element("enclosure") != null && x.Element("description") != null
select new RSSitem
{
Description = x.Element("description").Value.Substring(0,100)+"...",
Title = x.Element("title").Value,
ImageSource = x.Element("enclosure").FirstAttribute.Value
};
}
我已经测试了很多方法来解决我的问题,但仍然找不到答案
所以我的问题是:如何在列表框中显示来自同一页面上两个不同提要的最新新闻?
感谢您的帮助和宝贵的时间。首先,我建议在RSSItem中添加一个日期属性:
public class RSSItem
{
public DateTime Date { get; set; }
public string Description { get; set; }
public string Title { get; set; }
public string ImageSource { get; set; }
}
这样,当您下载两个RSS源时,您可以将它们编织在一起并按日期排序:
private IEnumerable<RSSItem> Weave(List<RSSItem> feed1, List<RSSItem> feed2)
{
return feed1.Concat(feed2)
.OrderByDescending(i => i.Date)
.Take(10); // Grab the ten most recent entries
}
private IEnumerable Weave(列表feed1,列表feed2)
{
返回馈线1.Concat(馈线2)
.OrderByDescending(i=>i.Date)
.Take(10);//抓取最近的十个条目
}
用法:
using System.Linq; // Don't forget to add using statement for System.Linq
public class RssReader
{
private List<IEnumerable<RSSItem>> _feeds = new List<IEnumerable<RSSItem>>();
public void Download()
{
WebClient wc = new WebClient();
wc.DownloadStringCompleted += this.FeedDownloaded;
wc.DownloadStringAsync(new Uri("feed-goes-here"));
}
private void FeedDownloaded(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null) return;
var xml = XElement.Parse(e.Result);
var feed = from x in xml.Descendants("item")
where x.Element("enclosure") != null && x.Element("description") != null
select new RSSItem()
{
Date = DateTime.Parse(x.Element("date").Value),
Title = x.Element("title").Value,
ImageSource = x.Element("enclosure").FirstAttribute.Value
};
_feeds.Add(feed);
if (_feeds.Count == 2)
{
var result = this.Weave(_feeds[0], _feeds[1]);
// Assign result to the list box's ItemSource
// Or better, use data binding.
}
}
/// <summary>
/// Combines the two feeds, sorts them by date, and returns the ten most recent entries.
/// </summary>
private IEnumerable<RSSItem> Weave(IEnumerable<RSSItem> feed1, IEnumerable<RSSItem> feed2)
{
return feed1.Concat(feed2)
.OrderByDescending(i => i.Date)
.Take(10);
}
}
使用System.Linq;//不要忘记为System.Linq添加using语句
公共类RssReader
{
私有列表_feeds=新列表();
公开下载
{
WebClient wc=新的WebClient();
wc.DownloadStringCompleted+=this.feeddownloads;
DownloadStringAsync(新Uri(“feed在这里”);
}
私有void FeedDownloaded(对象发送方,DownloadeStringCompletedEventArgs e)
{
if(e.Error!=null)返回;
var xml=XElement.Parse(e.Result);
var feed=来自xml.subjects(“项”)中的x
其中x.Element(“enclosure”)!=null&&x.Element(“description”)!=null
选择新RSSItem()
{
Date=DateTime.Parse(x.Element(“Date”).Value),
Title=x.元素(“Title”).值,
ImageSource=x.Element(“附件”).FirstAttribute.Value
};
_feed.Add(feed);
如果(_feeds.Count==2)
{
var result=this.Weave(_feeds[0],_feeds[1]);
//将结果分配给列表框的ItemSource
//或者更好地使用数据绑定。
}
}
///
///合并两个提要,按日期对它们进行排序,并返回最近的十个条目。
///
私有IEnumerable Weave(IEnumerable feed1,IEnumerable feed2)
{
返回馈线1.Concat(馈线2)
.OrderByDescending(i=>i.Date)
.采取(10);
}
}