0

在我的应用程序中,我将拥有用户保存的动态 rss 提要 url。所以我想知道我如何读取将由 rss 提要返回的 xml。该xml的结构是什么?我已经查看了一些提要 url,我注意到它们中的大多数都有标签titledescription但我不确定这一点。如果我得到这两个标签,那么我将解析 xml,但如果它们并不总是可用,那么在这种情况下我该如何解析 xml。

这两个包含标题和描述标签

http://rss.news.yahoo.com/rss/entertainment
http://xml.weather.yahoo.com/forecastrss?p=USCA1116
4

1 回答 1

0

首先,您需要阅读一个 XML 文件,我建议您使用 XPath 或 Linq to XML,正如您已经说过的,构成提要的三个主要元素;“标题”、“链接”和“描述”。

不久前我写了一个代码来做到这一点,我希望这对你有用。

我创建了这两个实体。

    public class RssFeed
    {
        public string Title { get; set; }

        public string Link { get; set; }

        public string Description { get; set; }

        public string PubDate { get; set; }

        public string Language { get; set; }

        public ObservableCollection<RssItem> RssItems { get; set; }
    }

    public class RssItem
    {
        public string Title { get; set; }

        public string Description { get; set; }

        public string Link { get; set; }
    }

然后在这种方法上,我使用Linq to XML从 XML 文件中读取每个元素

private static void ReadFeeds()
        {
            string uri = @"http://news.yahoo.com/rss/entertainment";

            WebClient client = new WebClient();
            client.DownloadStringAsync(new Uri(uri, UriKind.Absolute));

            client.DownloadStringCompleted += (s, a) =>
            {
                if (a.Error == null && !a.Cancelled)
                {
                    var rssReader = XDocument.Parse(a.Result);

                    var feed = (from rssFeed in rssReader.Descendants("channel")
                                select new RssFeed()
                                {
                                    Title = null != rssFeed.Descendants("title").FirstOrDefault() ?
                                            rssFeed.Descendants("title").First().Value : string.Empty,

                                    Link = null != rssFeed.Descendants("link").FirstOrDefault() ?
                                            rssFeed.Descendants("link").First().Value : string.Empty,

                                    Description = null != rssFeed.Descendants("description").FirstOrDefault() ?
                                            rssFeed.Descendants("description").First().Value : string.Empty,

                                    PubDate = null != rssFeed.Descendants("pubDate").FirstOrDefault() ?
                                            rssFeed.Descendants("pubDate").First().Value : string.Empty,

                                    Language = null != rssFeed.Descendants("language").FirstOrDefault() ?
                                            rssFeed.Descendants("language").First().Value : string.Empty
                                }).Single();

                    var rssFeeds = (from rssItems in rssReader.Descendants("item")
                                    select new RssItem()
                                    {
                                        Title = null != rssItems.Descendants("title").FirstOrDefault() ?
                                                 rssItems.Descendants("title").First().Value : string.Empty,

                                        Link = null != rssItems.Descendants("link").FirstOrDefault() ?
                                                 rssItems.Descendants("link").First().Value : string.Empty,

                                        Description = null != rssItems.Descendants("description").FirstOrDefault() ?
                                                 rssItems.Descendants("description").First().Value : string.Empty,
                                    }).ToList();

                    feed.RssItems = new ObservableCollection<RssItem>(rssFeeds);
                }
            };
        }

最后,您可以在任何您想要的地方显示您的提要。

于 2012-11-07T17:32:20.830 回答