2010-03-25 60 views
1

在時間表下,因此,突出點是「快速」,並且願意拋出一些$(不意味着我會付出正確的答案,而是用於商業產品:))。快速生成/發佈來自ASP.NET項目的RSS提要?

尋找在.NET框架2.0中可用的RSS提要生成器。理想情況下,它易於使用(推斷快),但足夠靈活以支持多種標準(shown part way down this page)。

我們在.NET中有業務類,並且想要在ASP.NET網站上發佈RSS提要。

任何軟件都很好?
不一定是免費的。
必須支持.NET框架2.0

謝謝。

考生和推理

  • Semweb - 似乎是無限期的沉寂 - 可能不是一個好主意拿起
  • ROWLEX - 基於Semweb,不喜歡使用的東西,其核心引擎是沒有更新
  • Linq2Rdf - 顯示過於複雜的快速解決方案
  • ​​- 嘗試它,並似乎是根一箇中心提供全方位舊/簡化格式 - 已經有一段時間沒有

回答

1

這裏被感動的,我已經用於從集合在我們的BLL一個RSS提要一些vb.net代碼:

Dim xws As New XmlWriterSettings() 
xws.Encoding = Encoding.UTF8 
Using xw As XmlWriter = XmlTextWriter.Create(XmlFileName, xws) 

    xw.WriteStartDocument() 
    xw.WriteStartElement("rss") 
    xw.WriteAttributeString("version", "2.0") 
    xw.WriteStartElement("channel") 
    xw.WriteElementString("title", Title) 
    xw.WriteElementString("link", Link) 
    xw.WriteElementString("description", Description) 
    xw.WriteElementString("managingEditor", Editor) 

    Dim items As System.Collections.Generic.List(Of FolderDocuments) = FolderDocuments.GetFolderDocuments() 
    If items IsNot Nothing Then 
     For Each fd As FolderDocuments In items 
      xw.WriteStartElement("item") 
      xw.WriteElementString("title", fd.Title) 
      xw.WriteElementString("description", fd.Intro) 
      xw.WriteElementString("link", fd.Url) 
      xw.WriteElementString("pubDate", fd.DateStart.ToString("R")) 
      xw.WriteEndElement() 
     Next 
    Else 
     xw.WriteStartElement("item") 
     xw.WriteEndElement() 
    End If 

    xw.WriteEndElement() 
    xw.WriteEndElement() 
    xw.WriteEndDocument() 
End Using 

這會寫入文件,但您可以輕鬆使用通用處理程序(.ashx)將參數傳遞給該文件,以便即時生成所需的rss訂閱源 - 爲xml編寫器使用Response.Output。

+0

我喜歡它。我不熟悉RSS的生成,這可能是一個愚蠢的問題,但它是否會給某些RSS閱讀器帶來問題,因爲它沒有指定XML名稱空間?當我查看RSS示例時,我經常看到http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html中鏈接的命名空間。有時,例如,我的Firefox「直播書籤「將無法識別簡化種類的Feed。我很想知道您是否針對廣泛的讀者使用這種或者特定的讀者? – 2010-03-25 16:44:23

+0

您可以向作者添加命名空間:http://msdn.microsoft.com/en-us/library/cfche0ka.aspx – ScottE 2010-03-25 19:09:08

2

最近,我爲ASP.NET應用程序創建了一個RSS提要生成器。首先,你從XmlWriter派生。然後,您創建將託管供稿的頁面。你去:

public enum RssElements 
{ 
    Rss, Channel, Title, Description, Link, Copyright, Generator, Item, PubDate 
} 
public enum RssAttributes 
{ 
    Version 
} 

/// <summary> 
/// RSS writer that emits RSS feeds. 
/// </summary> 
public class RssWriter : XmlWriter 
{ 
    private XmlWriter writer; 
    private Stream objStream; 

    #region Constructor 
    public RssWriter (Stream stream) 
    { 
     objStream = stream; 
     writer = XmlWriter.Create (objStream); 
    } 
    #endregion 

    #region Stream Related Operations 

    public override void Close() 
    { 
     objStream.Close(); 
     writer.Close(); 
    } 

    public override void Flush() 
    { 
     writer.Flush(); 
    } 

    #endregion 

    #region Writing Elements 
    public void WriteStartElement (RssElements element) 
    { 
     string elementName = ""; 

     switch (element) 
     { 
      case RssElements.Channel: 
       elementName = "channel"; 
       break; 
      case RssElements.Copyright: 
       elementName = "copyright"; 
       break; 
      case RssElements.Description: 
       elementName = "description"; 
       break; 
      case RssElements.Generator: 
       elementName = "generator"; 
       break; 
      case RssElements.Item: 
       elementName = "item"; 
       break; 
      case RssElements.Link: 
       elementName = "link"; 
       break; 
      case RssElements.PubDate: 
       elementName = "pubDate"; 
       break; 
      case RssElements.Rss: 
       elementName = "rss"; 
       break; 
      case RssElements.Title: 
       elementName = "title"; 
       break; 
     } 
     writer.WriteStartElement (elementName); 
    } 
    public void WriteElementString (RssElements element, string value) 
    { 
     string elementName = ""; 

     switch (element) 
     { 
      case RssElements.Channel: 
       elementName = "channel"; 
       break; 
      case RssElements.Copyright: 
       elementName = "copyright"; 
       break; 
      case RssElements.Description: 
       elementName = "description"; 
       break; 
      case RssElements.Generator: 
       elementName = "generator"; 
       break; 
      case RssElements.Item: 
       elementName = "item"; 
       break; 
      case RssElements.Link: 
       elementName = "link"; 
       break; 
      case RssElements.PubDate: 
       elementName = "pubDate"; 
       break; 
      case RssElements.Rss: 
       elementName = "rss"; 
       break; 
      case RssElements.Title: 
       elementName = "title"; 
       break; 
     } 
     writer.WriteElementString (elementName, value); 
    } 
    public override void WriteEndElement() { writer.WriteEndElement(); } 
    #endregion 

    #region Writing Attributes 
    public void WriteStartAttribute (RssAttributes attb) 
    { 
     if (attb == RssAttributes.Version) 
     { 
      writer.WriteStartAttribute ("version"); 
     } 
    } 
    public void WriteAttributeString (RssAttributes attb, string value) 
    { 
     if (attb == RssAttributes.Version) 
     { 
      writer.WriteAttributeString ("version", value); 
     } 
    } 
    public override void WriteEndAttribute() { writer.WriteEndAttribute(); } 
    #endregion 

    #region Writing Data 
    public override void WriteCData (string text) { writer.WriteCData (text); } 
    public override void WriteChars (char [] buffer, int index, int count) { writer.WriteChars (buffer, index, count); } 
    public override void WriteComment (string text) { writer.WriteComment (text); } 
    public override void WriteWhitespace (string ws) { writer.WriteWhitespace (ws); } 
    public override void WriteString (string text) { writer.WriteString (text); } 
    #endregion 

    #region Document 
    public override void WriteStartDocument() { writer.WriteStartDocument(); } 
    public override void WriteStartDocument (bool standalone) { writer.WriteStartDocument (standalone); } 
    public override void WriteEndDocument() { writer.WriteEndDocument(); } 
    #endregion 

    #region Not Implemented Methods 
    void ThrowException() { throw new Exception ("The method or operation is not implemented."); } 
    public override string LookupPrefix (string ns) { ThrowException(); return ""; } 
    public override void WriteBase64 (byte [] buffer, int index, int count) { ThrowException(); } 
    public override void WriteCharEntity (char ch) { ThrowException(); } 
    public override void WriteStartElement (string prefix, string localName, string ns) { ThrowException(); } 
    public override WriteState WriteState 
    { 
     get { throw new Exception ("The method or operation is not implemented."); } 
    } 
    public override void WriteSurrogateCharEntity (char lowChar, char highChar) { ThrowException(); } 
    public override void WriteEntityRef (string name) { ThrowException(); } 
    public override void WriteFullEndElement() { ThrowException(); } 
    public override void WriteProcessingInstruction (string name, string text) { ThrowException(); } 
    public override void WriteRaw (string data) { ThrowException(); } 
    public override void WriteRaw (char [] buffer, int index, int count) { ThrowException(); } 
    public override void WriteStartAttribute (string prefix, string localName, string ns) { ThrowException(); } 
    public override void WriteDocType (string name, string pubid, string sysid, string subset) { ThrowException(); } 
    #endregion 
} 

然後你創建主機頁面。這是一個空白頁面;所有的工作都在Page_Load事件中完成。下面我給你一個Page_Load事件。注意:您可以用業務對象替換數據庫對象。

protected void Page_Load (object sender, EventArgs e) 
{ 
    Response.ContentEncoding = System.Text.Encoding.UTF8; 
    Response.ContentType = "text/xml"; 
    RssWriter writer = new RssWriter (Response.OutputStream); 
    writer.WriteStartElement (RssElements.Rss); 
    writer.WriteAttributeString (RssAttributes.Version, "2.0"); 
    writer.WriteStartElement (RssElements.Channel); 
    writer.WriteElementString (RssElements.Title, "XYZ corp.com"); 
    writer.WriteElementString (RssElements.Link, "http://www.yourdomain.com"); 
    writer.WriteElementString (RssElements.Description, "Latest news from XYZ corp"); 
    writer.WriteElementString (RssElements.Copyright, "Copyright (C) XYZ corp. All rights reserved."); 
    writer.WriteElementString (RssElements.Generator, "XYZ corp XML RSS Generator"); 

    DataTable newsTable = NewsAccess.GetLatestNewsByDate (false); 

    if (newsTable.Rows.Count > 0) { 
    for (int i = 0; i < newsTable.Rows.Count; ++i) 
    { 
     string id = newsTable.Rows [i] ["LatestNewsID"].ToString(); 
     string subject = newsTable.Rows [i] ["Subject"].ToString(); 
     string description = newsTable.Rows [i] ["Description"].ToString(); 
     bool publicView = newsTable.Rows [i] ["PublicView"].ToString() == "True" ? true : false; 
     if (!publicView) 
      continue; 

     //string details = newsTable.Rows [i] ["Details"].ToString(); 
     DateTime dt = DateTime.Parse (newsTable.Rows [i] ["DateCreated"].ToString()); 
     string date = dt.ToString ("R"); 


     writer.WriteStartElement (RssElements.Item); 
     writer.WriteElementString (RssElements.Title, subject); 
     writer.WriteElementString (RssElements.Link, "http://www.yourdomain.com/Contents/News/newsarticle.aspx?id=" + id.ToString()); 

     writer.WriteElementString (RssElements.Description, description); 
     writer.WriteElementString (RssElements.PubDate, date); 
     writer.WriteEndElement(); 
    } 
    } 

    writer.WriteEndElement(); 
    writer.WriteEndElement(); 
    writer.Close(); 
    Response.End(); 
} 

我希望它有所幫助。