¿Cómo leer un RSS y mostrar la información en ASP.NET MVC?

Para los que no saben que es un RSS, primero explicaremos que es y después veremos el ejemplo.


¿Qué es un feed RSS y cómo puedo usarlo?

RSS significa Rich Site Summary o también conocido como Really Simple Syndication. Es un formato para publicar contenido web que cambia regularmente y está escrito en XML. Hay muchos creadores de feeds RSS gratuitos disponibles en línea, como Feedburner, Feedity, etc. Usando RSS, puede publicar fácilmente contenido web regularmente actualizado, como blogs, artículos, noticias, etc.

Muchos sitios relacionados con noticias, weblogs y otros editores en línea distribuyen su contenido como fuente RSS a quien lo desee. Los canales RSS tienen las siguientes características:

  • Le permite sindicar el contenido de su sitio
  • Los archivos RSS se pueden actualizar automáticamente
  • Define una manera fácil de compartir y ver titulares y contenido
  • Permite vistas personalizadas para diferentes sitios

Cargar un feed RSS en ASP.Net HTML


@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>rss</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <style type="text/css">
        .jobs-well {
            padding: 20px;
            margin: 20px 0;
            border: 1px solid #eee;
            border-left-width: 5px;
            border-radius: 3px;
            border-left-color: #0288d1;
        }

            .jobs-well h4 {
                color: #0288d1;
            }
    </style>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-md-12 ">
                <br />
                <form action="~/Demo/rss" method="post">
                    <div class="panel panel-primary">
                        <div class="panel-heading">
                            <h4>How to Read and Display RSS Feed in ASP.NET MVC C#</h4>
                        </div>

                        <div class="panel-body">
                            <div class="form-group">
                                <label>Feed URL</label>
                                <input name="txt_url" type="url" class="form-control" placeholder="Feed URL" required value="@ViewBag.txt_url" />
                            </div>
                            <div class="form-group">
                                <label>Feed Type</label>
                                <select name="drp_typ" class="form-control">
                                    <option value="RSS">RSS</option>
                                    <option value="OTHER">OTHER</option>
                                </select>
                            </div>
                        </div>

                        <div class="panel-footer">
                            <button type="submit" class="btn btn-success">Go!</button>
                        </div>
                    </div>
                </form>
            </div>
            <div class="col-md-12">
                <div class="panel panel-warning">
                    <div class="panel-heading">
                        <h4>Feed Details </h4>
                    </div>

                    <div class="panel-body">
                        
                        @if (ViewBag.RSS != null)
                        {
                            foreach (var item in ViewBag.RSS)
                            {
                            <div class="jobs-well">
                                <h4>@item.Title></h4>
                                <div class="cnt" style="overflow: hidden">@item.Content</div>

                                <hr />
                                <a href='@item.Link' target="_blank" class="btn btn-success"><i class="fa fa-check"></i>View Details</a>
                            </div>
                            }
                        }
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

Código C#

public ActionResult rss(string drp_typ, string txt_url)
        {
            ViewBag.txt_url = txt_url;
            FeedParserHelper parser = new FeedParserHelper();

            if (drp_typ == "OTHER")
            {
            }
            else if (drp_typ == "RSS")
            {
                ViewBag.RSS = parser.Parse(txt_url, FeedType.RSS);
            }
            return View();
        }

Clase FeedParserHelper

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Linq;
/// <summary>
    /// Summary description for FeedParserHelper
    /// </summary>
    public class FeedParserHelper
    {
        /// <summary>
        /// Parses the given <see cref="FeedType"/> and returns a <see cref="IList&amp;lt;Item&amp;gt;"/>.
        /// </summary>
        /// <returns></returns>
        public IList<Item> Parse(string url, FeedType feedType)
        {
            return ParseRss(url);
        }

        /// <summary>
        /// Parses an RSS feed and returns a <see cref="IList&amp;lt;Item&amp;gt;"/>.
        /// </summary>
        public virtual IList<Item> ParseRss(string url)
        {
            try
            {
                XDocument doc = XDocument.Load(url);
                // RSS/Channel/item
                var entries = from item in doc.Root.Descendants().First(i => i.Name.LocalName == "channel").Elements().Where(i => i.Name.LocalName == "item")
                              select new Item
                              {
                                  FeedType = FeedType.RSS,
                                  Content = item.Elements().First(i => i.Name.LocalName == "description").Value,
                                  Link = item.Elements().First(i => i.Name.LocalName == "link").Value,
                                  PublishDate = ParseDate(item.Elements().First(i => i.Name.LocalName == "pubDate").Value),
                                  Title = item.Elements().First(i => i.Name.LocalName == "title").Value
                              };
                return entries.ToList();
            }
            catch
            {
                return new List<Item>();
            }
        }

        private DateTime ParseDate(string date)
        {
            DateTime result;
            if (DateTime.TryParse(date, out result))
                return result;
            else
                return DateTime.MinValue;
        }
    }

    public enum FeedType
    {
        /// <summary>
        /// Really Simple Syndication format.
        /// </summary>
        RSS
    }

    public class Item
    {
        public string Link { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public DateTime PublishDate { get; set; }
        public FeedType FeedType { get; set; }

        public Item()
        {
            Link = string.Empty;
            Title = string.Empty;
            Content = string.Empty;
            PublishDate = DateTime.Today;
            FeedType = FeedType.RSS;
        }
    }

 

Adalberto Cisneros

Desarrollador para plataformas web y móviles. Tengo más de 4 años de desarrollar proyectos independientes, con frecuencia escribo artículos sobre temas de tendencias de desarrollo, diseño y medios de comunicación social

Artículos relacionados
0 Comentarios
Enviame un comentario