Webportálok fejlesztése - RSS feed forráskódból
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
Az itt bemutatott példák az RTFM (Real-Time Financial News Monitoring) c. projektből származnak. Annyit szükséges tudni róla, hogy tőzsdei híreket gyűjt különböző magyar hírportálokról.
Minta egy RSS 2.0 xml file-ra
Az RSS 2.0 szabványról a http://www.rssdotnet.com/documents/version_comparison.html linken találtok leírást olyan tekintetben, hogy mik a szükséges és opcionális XML tagek.
<rss version="2.0"> <channel> <title>RTFM</title> <link>http://localhost/RTFM/Default.aspx</link> <description>Real-Time Financial news Monitoring</description> <copyright>(c) 2006, Pallos Péter, Pallos Tamás</copyright> <pubDate>Fri, 11 Aug 2006 17:17:31 GMT</pubDate> <item> <title>Ködösítésből ötös</title> <description> Majd meglátják, mire jutnak egymással – lényegében ennyi derült ki a General Motors és a Nissan-Renault vezetőinek ma esedékes tárgyalásáról. </description> <link> http://www.napi.hu/default.asp?cCenter=article.asp&nID=299809 </link> <pubDate>Fri, 14 Jul 2006 11:26:56 GMT</pubDate> </item> </channel> </rss>
rss.aspx
RSS feednél a ContentType-ot kétféle értékre szokták állítani: használják a =text/xml= és az =application/rss+xml= mime type-okat. Kompatibilitási okokból az utóbbit válaszoltam. A =<html>...</html>= rész csak azért szükséges, hogy megnyugtassam a fordítót, és ne warningoljon. A .cs file-ban úgyis felülírom a kimenetet.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="rss.aspx.cs" Inherits="rss" ContentType="text/xml" %> <html> <body> </body> </html>
web.config
A konfigurációs file-ban tárolom az adatbázis kapcsolat felépítéséhez szükséges connection stringet. Az adatbázis szerveren az SQLEXPRESS-ről defaultra van állítva, az authentikációt a Windows végzi és az adatbázis neve rtfm. A connection stringet a System.Configuration.ConfigurationManager osztályon keresztül kérdezem le.
<connectionStrings> <clear/> <add name="RTFMConnectionString" connectionString="Data Source=.;Integrated Security=True;Initial catalog=rtfm" providerName="System.Data.SqlClient"/> </connectionStrings>
rss.aspx.cs
Az adatbázis tartalmaz egy Article táblát, ami a begyűjtött cikkeknek tartalmazza a címét, leadjét, url-jét és dátumát. Az utolsó cikkeket a listLastArticles tárolt eljárás kérdezi le. Az eljárás paramétere a @lastn, ami a lekérendő cikkek számát határozza meg.
Az oldal kimenetét közvetlenül írom a Response.OutputStream-en keresztül XmlTextWriter-rel.
Még egy nemtriviális dolgot nem említettem: a dátum formázását. A cikk dátumát pl. a következő módon lehet nemzetközi formátumúvá alakítani: =((DateTime)rdr["time"]).ToString("R")=.
using System; using System.Data; using System.Configuration; using System.Xml; using System.Text; using System.Data.SqlClient; public partial class rss : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { XmlTextWriter xw = new XmlTextWriter(Response.OutputStream, Encoding.UTF8); WriteHeader(xw); WriteItems(xw); WriteFooter(xw); Response.End(); } private void WriteHeader(XmlTextWriter xw) { xw.WriteStartDocument(); xw.WriteStartElement("rss"); xw.WriteAttributeString("version", "2.0"); xw.WriteStartElement("channel"); xw.WriteElementString("title", "RTFM"); xw.WriteElementString("link", "http://localhost/RTFM/Default.aspx"); xw.WriteElementString("description", "Real-Time Financial news Monitoring"); xw.WriteElementString("copyright", "(c) 2006, Pallos Péter, Pallos Tamás"); // Writes the time in the following format: Fri, 14 Jul 2006 11:26:56 GMT xw.WriteElementString("pubDate", DateTime.Now.ToString("R")); } private void WriteItems(XmlTextWriter xw) { SqlConnection conn = new SqlConnection( ConfigurationManager.ConnectionStrings["RTFMConnectionString"].ConnectionString); conn.Open(); // SELECT TOP @lastn time, title, lead, url FROM Article ORDER BY time SqlCommand cmd = new SqlCommand("listLastArticles", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@lastn", 10); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { xw.WriteStartElement("item"); xw.WriteElementString("title", rdr["title"].ToString()); xw.WriteElementString("description", rdr["lead"].ToString()); xw.WriteElementString("link", rdr["articleUrl"].ToString()); xw.WriteElementString("pubDate", ((DateTime)rdr["time"]).ToString("R")); xw.WriteEndElement(); } rdr.Close(); conn.Close(); } private void WriteFooter(XmlTextWriter xw) { xw.WriteEndElement(); xw.WriteEndElement(); xw.WriteEndDocument(); xw.Close(); } }
-- Peti - 2006.08.11.