2010-03-25 63 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(); 
} 

我希望它有所帮助。