Dinamik RSS Oluşturma

Bu yazının konusu, veritabanımızda bulunan kayıtları RSS ile dış dünyaya servis etme ile ilgilidir.

Dilerseniz önce RSS nedir, bundan kısaca bahsedelim.

RSS (Rich Site Summary / Really Simple Syndication) sitelerin içeriklerini, başlıklar şeklinde sunmak için kullanılan bir teknolojidir. Temelinde bir XML dosyası yatar. Bu teknoloji ilk olarak 1999 yılında Netspace tarafından geliştirilmiştir.

Tipik bir RSS dosyası yapısı şu şekildedir:

<rss version="2.0">
<channel>
  <title>Site Basligi</title>
  <link>http://www.siteninadresi.com</link>
  <description>Siteyle ilgili kisa açiklama</description>
  <language>RSS'in yayinlandigi dil kodu. Türkçe için tr</language>
<item>
  <title>Ilk Içerigin Basligi</title>
  <link>Ilk Içerigin Adresi</link>
  <description>Ilk Içerigin Metni</description>
</item>
<item>
  <title>Ikinci Içerigin Basligi</title>
  <link>Ikinci Içerigin Adresi</link>
  <description>Ikinci Içerigin Metni</description>
</item>
</channel>
</rss>

Gördüğünüz üzere ilk satırda bu dosyanın bir RSS bilgisi olduğunu ve versiyonun 2.0 olduğunu belirtiyoruz. Channel etiketi içerisinde, bazı sabit bilgiler belirtiyoruz. Item'lar ise tahmin edeceğiniz üzere veritabanından okuyup teker teker dinamik şekilde oluşturacağımız bilgiler.

Biz, ASP.NET te RSS dosya oluşturma işini rahatlıkla gerçekleştirebilmekteyiz.

Öncelikle elimizde bir DataTable olduğunu varsayalım. Siz istediğiniz şekilde doldurun bu DataTable'ı.

O zaman Page_Load olayı içerisine yazmamız gereken kod şu şekilde olmalıdır:

DataTable dt = ...; // bilgiyi db den doldurduğumuzu düşünüyoruz
string baslik = "Site Başlığı";
string link = "Site adresi";
string desc = "açıklama bilgisi";
string img_url = "Logonun tam yolu";
string img_title = "Logo açıklaması";
string img_link = "Logo linki";

Response.Clear();
Response.ContentType = "text/xml";
XmlTextWriter objX = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
objX.WriteStartDocument();
objX.WriteStartElement("rss");
objX.WriteAttributeString("version", "2.0");
objX.WriteStartElement("channel");
objX.WriteElementString("title", baslik);
objX.WriteElementString("link", link);
objX.WriteElementString("description", desc);
objX.WriteElementString("language", "tr");
objX.WriteStartElement("image");
  objX.WriteElementString("url", img_url);
  objX.WriteElementString("title", img_title);
  objX.WriteElementString("link", img_link);
objX.WriteEndElement();

foreach (DataRow dr in dt.Rows)
{
  string url = string.Format("http://www.domaininiz.com/Goster.aspx?Id={0}, dr["Id"].ToString());
  string str = dr["Ozet"].ToString(); // html formatında istediğinizi gibi doldurabilirsiniz
  objX.WriteStartElement("item");
  objX.WriteElementString("title", dr["Baslik"].ToString());
  objX.WriteElementString("description", str);
  objX.WriteElementString("pubDate", Convert.ToDateTime(dr["Tarih"]).ToString("R"));
  objX.WriteElementString("link", url);
  objX.WriteEndElement();
}
objX.WriteEndElement();
objX.WriteEndElement();
objX.WriteEndDocument();
objX.Flush();
objX.Close();
Response.End();

XmlTextWriter sınıfı ile rahatlıkla yeni elementler, bu elementlere attribute'lar oluşturabiliyoruz.

Dikkat etmemiz gereken önemli bir konu da, açılan her elementi hiyerarşiye uygun bir şekilde kapatmamız gerektiğidir.

foreach döngüsü ile item'ları nasıl oluşturduğumuzu da farketmişsinizdir.

Bu kodu kullanarak oluşturduğum birkaç RSS linki:

http://istanbul.meb.gov.tr/RSS/Baslik/0/Son-Eklenenler.aspx adresindeki RSS' e dikkat ettiyseniz sağ tarafta kategoriler yer almaktadır. Itemlara category elementi ekleyerek bu işi gerçekleştirdik.

Şimdi de istanbul.meb.gov.tr RSS servisi kodlarını sizinle paylaşmak istiyorum.

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.QueryString.Count < 1) Response.End();

    string s = GenelIslemler.MetniTemizle(Request.QueryString[0].ToString());
    DataTable dt = null;
    int adet = 30;
    string baslik = "";
    string link = "";
    if (s == "Baslik")
    {
        HaberlerDB habDB = new HaberlerDB();
        int id = Convert.ToInt32(Request.QueryString[1].ToString());
        if (id == 0) adet = 60;
        if (id == 0)
            baslik = "İstanbul İl Milli Eğitim Müdürlüğü - Son Eklenenler";
        else
            baslik = "İstanbul İl Milli Eğitim Müdürlüğü - " + habDB.HaberBaslikGetir(id);
        dt = habDB.HaberListesiGetir(id, 1, adet);
        link = "http://istanbul.meb.gov.tr/rssGoster.aspx?Tip=Baslik&Id=" + id;
    }
    else
        Response.Redirect("/Anasayfa.aspx", true);

    Response.Clear();
    Response.ContentType = "text/xml";
    XmlTextWriter objX = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
    objX.WriteStartDocument();
    objX.WriteStartElement("rss");
    objX.WriteAttributeString("version", "2.0");
    objX.WriteStartElement("channel");
    objX.WriteElementString("title", baslik);
    objX.WriteElementString("link", link);
    objX.WriteElementString("description", "istanbul.meb.gov.tr - Rss");
    objX.WriteElementString("language", "tr");
    objX.WriteStartElement("image");
      objX.WriteElementString("url", "http://istanbul.meb.gov.tr/images/meblogo.jpg");
      objX.WriteElementString("title", "İstanbul İl Milli Eğitim Müdürlüğü");
      objX.WriteElementString("link", "http://istanbul.meb.gov.tr/");
    objX.WriteEndElement();
    
    foreach (DataRow dr in dt.Rows)
    {
        string url = string.Format("http://istanbul.meb.gov.tr/IcerikDetay/{0}/{1}.aspx",
                dr["Id"].ToString(), GenelIslemler.URLCevir(dr["Baslik"].ToString()));
        objX.WriteStartElement("item");
        objX.WriteElementString("title", dr["Baslik"].ToString());
        string str = dr["Ozet"].ToString();
        if (!string.IsNullOrEmpty(dr["Resim"].ToString()))
            str = string.Format(@"<a href=""{0}"" target=""_blank"">
                      <img src=""http://istanbul.meb.gov.tr{1}"" style=""border:0px;"" 
                       alt="""" align=""left"" hspace=""2"" vspace=""2""/></a>",
                  url, dr["Resim"].ToString()) + str;
        objX.WriteElementString("category", dr["HaberBaslik"].ToString());
        objX.WriteElementString("description", str);
        objX.WriteElementString("pubDate", Convert.ToDateTime(dr["Tarih"]).ToString("R"));
        objX.WriteElementString("link", url);
        objX.WriteEndElement();
    }
    objX.WriteEndElement();
    objX.WriteEndElement();
    objX.WriteEndDocument();
    objX.Flush();
    objX.Close();
    Response.End();
}

Herkese iyi çalışmalar... :)

Not: RSS iconları için buraya bakabilirsiniz.