We help IT Professionals succeed at work.

Parse podcast RSS feed in C#

Medium Priority
Last Modified: 2013-11-18
I am having some difficulty with podcast RSS feeds.  I am able to read the feed in and parse the tags without a problem, but I run into problems as I iterate through each item in the channel and trying to figure out which attribute actually has the link to the MP3.  

Some feeds use the link tag, others use the enclosure and then there are the itunes tags.  Is there any advice on the best way to handle this?

This is the code I'm currently working with.
if (string.IsNullOrEmpty(url))
                throw new ArgumentNullException("url");
           RSSFeed feed = new RSSFeed();
                string content = GetURLSource(url);
                XmlDocument rssDoc = new XmlDocument();
                XmlNodeList rssNodes = rssDoc.SelectNodes("/rss/channel/item");
                feed.Link = rssDoc.SelectSingleNode("/rss/channel/link") != null ? rssDoc.SelectSingleNode("/rss/channel/link").InnerText : string.Empty;
                feed.Title = rssDoc.SelectSingleNode("/rss/channel/title") != null ? rssDoc.SelectSingleNode("/rss/channel/title").InnerText : string.Empty;
                feed.Description = rssDoc.SelectSingleNode("/rss/channel/description") != null ? rssDoc.SelectSingleNode("/rss/channel/description").InnerText : string.Empty;
                if (rssNodes != null)
                    foreach (XmlNode node in rssNodes)
                        RSSEvent rssEvent = new RSSEvent
                            CopyRight = node.SelectSingleNode("copyright") != null ? node.SelectSingleNode("copyright").InnerText : string.Empty,
                            Description = node.SelectSingleNode("description") != null ? node.SelectSingleNode("description").InnerText : string.Empty,
                            Link = node.SelectSingleNode("link") != null ? node.SelectSingleNode("link").InnerText : string.Empty,
                            PubDate = node.SelectSingleNode("pubdate") != null ? node.SelectSingleNode("pubdate").InnerText : string.Empty,
                            Title = node.SelectSingleNode("title") != null ? node.SelectSingleNode("title").InnerText : string.Empty,
                            EnclosureUrl = node.SelectSingleNode("enclosure") != null ? node.SelectSingleNode("enclosure").Attributes["url"].InnerText : string.Empty,
                            EnclosureType = node.SelectSingleNode("enclosure") != null ? node.SelectSingleNode("enclosure").Attributes["type"].InnerText : string.Empty,
                            EnclosureLength = node.SelectSingleNode("enclosure") != null ? node.SelectSingleNode("enclosure").Attributes["length"].InnerText : string.Empty
            catch (Exception ex)
                throw new Exception(ex.Message, ex.InnerException);
            return feed;

Open in new window

Watch Question

Unlock this solution and get a sample of our free trial.
(No credit card required)


Excellent response.  However I need to find a clean way of differentiating between a podcast feed and an iTunes feed.


... also, you list an interface called IRssHandler.  Is there code for that please?
IRssHandler is the base interface for all of the "RSS Handlers".  It would look something like this:
public interface IRssHandler
    ///<Summary>Parse the root element of the feed and build a Feed object</Summary>
    public Feed parseFeed();
    ///<Summary>Parse the feed events into RSSEvent collection</Summary>
    public RSSEvent[] parseEvents();

Open in new window

To check if it is a iTunes feed you should just check to see if it has an itunes namespace.  Something like this:
if (rssDoc.DocumentElement.GetAttribute("xmlns:itunes")!="")
  handler=new iTunesRSSHandler(rssDoc);
else if //Other rss types here

Open in new window


Thanks!  Excellent advice.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.


Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.