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.
