Webportálok fejlesztése - RSS feed forráskódból

A VIK Wikibő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.