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

A VIK Wikiből
A lap korábbi változatát látod, amilyen David14 (vitalap | szerkesztései) 2013. február 6., 11:02-kor történt szerkesztése után volt. (David14 átnevezte a(z) RSS feed megvalósítása forráskódból lapot a következő névre: Webportálok fejlesztése - RSS feed forráskódból)
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

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.