2014-04-06 176 views
-3

如何检索博客/网站最近的帖子来自其他博客 像http://www.indiblogger.in如何检索博客/网站最近的帖子来自其他博客

从任何网站或博客最近的文章中,该存储到我的数据库.. 。 如何在asp.net C#实现这个

+1

哪里是你的代码?这是一个忍者代码?(我没有看到它的主要帖子,也许这是隐藏的时刻)。如果你不知道“如何”,你谷歌“阅读rss c#asp.net” – Tinwor

+0

@Tinwor,+1的忍者代码。 (虽然忍者虫的方式更糟糕:)) – BradleyDotNET

回答

2

的配方来回答你的问题是:

  1. 检索饲料
  2. 创建一个数据库上下文
    1. 创建实体类
    2. 创建DbSet
  3. 添加feeditems到DbSet
  4. 创建一个网页
    1. 添加GridView和按钮
    2. 在代码隐藏添加代码

检索Feed

根据您的链接,第一步是找到我们可以在哪里找到可以让我们检索这些内容的帖子。 Feed URL由feedburner提供。
接下来我们使用SyndicationFeed的Load方法。该方法接受一个XmlReader可惜RSSFeed中使用的日期格式是不理解,所以我们必须使用一个helper provided by Micorosft:

的XmlReader助手

class MyXmlReader : XmlTextReader 
    { 
     private bool readingDate = false; 
     const string CustomUtcDateTimeFormat = "ddd MMM dd HH:mm:ss Z yyyy"; // Wed Oct 07 08:00:07 GMT 2009 

     public MyXmlReader(Stream s) : base(s) { } 

     public MyXmlReader(string inputUri) : base(inputUri) { } 

     public override void ReadStartElement() 
     { 
      if (string.Equals(base.NamespaceURI, string.Empty, StringComparison.InvariantCultureIgnoreCase) && 
       (string.Equals(base.LocalName, "lastBuildDate", StringComparison.InvariantCultureIgnoreCase) || 
       string.Equals(base.LocalName, "pubDate", StringComparison.InvariantCultureIgnoreCase))) 
      { 
       readingDate = true; 
      } 
      base.ReadStartElement(); 
     } 

     public override void ReadEndElement() 
     { 
      if (readingDate) 
      { 
       readingDate = false; 
      } 
      base.ReadEndElement(); 
     } 

     public override string ReadString() 
     { 
      if (readingDate) 
      { 
       string dateString = base.ReadString(); 
       DateTime dt; 
       if(!DateTime.TryParse(dateString,out dt)) 
        dt = DateTime.ParseExact(dateString, CustomUtcDateTimeFormat, CultureInfo.InvariantCulture); 
       return dt.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture); 
      } 
      else 
      { 
       return base.ReadString(); 
      } 
     } 
    } 

的FeedReader

SyndicationFeed LoadFeed() 
{ 
    return SyndicationFeed.Load(
    new MyXmlReader(@"http://feeds.feedburner.com/indiblogger?format=xml") 
    ); 
} 

数据库

对于database use EntityFramework 6(使用Nuget进行安装)

对于codefirst方法创建的DbContext派生类和属性为您的帖子

class BlogContext:DbContext 
{ 
    public DbSet<Post> Posts { get; set; } 
} 

而一个类来保存后您的数据。

public class Post 
{ 
    public int Id {get; set;} 
    public string Body { get; set;} 
} 

主要功能

合并数据Feed的负荷和数据库存储。迭代feed.Items,从项目数据创建一个Post并将每个Post添加到DataContext上的Posts集合。不要忘记拨打SaveChanges将所有内容存储在数据库中。

public void LoadFeedAndStore() 
{ 
    var feed = LoadFeed(); 
    var db = new BlogContext(); 

    foreach(var item in feed.Items) 
    { 
     db.Posts.Add(
     new Post { 
      Body = item.Summary == null ? "<empty>": item.Summary.Text 
      }); 
    } 
    db.SaveChanges(); 
} 

显示在asp中。

净页面

要显示在网页上的柱帖子收集的结果

标记绑定到gridvew页面

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" 
    CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
</asp:Content> 
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 
    <asp:GridView ID="GridView1" runat="server" OnLoad="Grid_Load" > 
    </asp:GridView> 
    <asp:Button ID="Button1" runat="server" Text="Load Feed" OnClick="Button1_Click"/> 
</asp:Content> 

代码隐藏

我们使用BlogContext一次并在Posts上调用ToList()以获取Post对象的数据绑定列表。 GridView拥有所有的知识在html页面中呈现这个列表。

protected void Grid_Load(object sender, EventArgs e) 
{ 
    var db = new BlogContext(); 
    GridView1.DataSource = db.Posts.ToList(); 
    GridView1.DataBind(); 
} 

如果点击按钮,我们加载饲料数据库:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    LoadFeedAndStore(); 
} 
+0

+1一个惊人的答案,超出了OP所显示的努力量。 – BradleyDotNET