Webportálok fejlesztése - RSS feed forráskódból
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.