Makale Özeti

Nedir RSS (Really Simple Syndication) diye soracak olursanız, çok açık olarak "web sitelerini ziyaret etmeden site içindeki yeni içerigi almanin bir yolu"dur derim. Sanırm bunun için en iyi örnek haber siteleri olacaktır. Yeni haber yayınlandıgında siz bu haberi okumak için o siteyi ziyaret etmeniz lazim, ama bir RSS okuyucunuz varsa bu işi sizin adınıza yapacaktır. Yazgelistir.com'da RSS hizmetini kullanıcılarına vermektedir. Makalemizin konusuda gelişmiş bir RSS okuyucu yapmaktansa, RSSleri nasıl okuruz ve basitce nasıl oluştururuz onu incelemek.

Makale

başlık: RSS'leri okumak ve yeni RSS'ler yazmak

Özet: Nedir RSS (Really Simple Syndication) diye soracak olursanız cevap çok açık olacak "web sitelerini ziyaret etmeden site içindeki yeni içerigi almanin bir yolu"dur  derim. Sanırm bunun için en iyi örnek haber siteleri olacaktır. Yeni haber yayınlandıgında siz bu haberi okumak için o siteyi ziyaret etmeniz lazim, ama bir RSS okuyucunuz varsa bu işi sizin adınıza yapacaktır. Makalemizin konusuda gelişmiş bir RSS okuyucu yapmaktansa, RSSleri nasıl okuruz ve basitce nasıl oluştururuz onu incelemek.

 

RSSlerin zengin içerikli bir sitenin en yeni icerigini ve özetini almak oldugunu ögrendik. Peki nedir bu  RSSlerin yapısı derseniz, genellikle cool sitelerin içinde görürsünüz "turuncu RSS" butonu , işte bu butonla genellikle bir XML dosyası alırsınız. RSSler asılda XML yapısında dosyalardır.

RSS okuyucu programlara RSS in adresi verirsiniz yani URI sini o XML dosyasını çeker parse'ledikten sonra gerekli alanları bize gosterir. O hizmeti veren sitedeki yapı ise dinamik olarak RSS dokumanlarini sitenin yeni eklenen içerigine göre yaratıp veritabanına saklamaktır.

Çok çeşitli RSS okuyucuları var, outlook veya browseriniz ile organize çalışan yada kendi başına çalışan. Daha öncede söyledigimiz gibi RSS in kalbi XML standartları. Ya bu XML dosyalarını kendiniz yapacaksınız, yada dinamik olmasını istiyorsanız yaptiginiz bir araç sürekli veritabanını kontrol ederek yenileri otomatik oluşturmalıdır.

Klasik olarak hep verilen haber sitelerini bende örnek vericem bunlardan ülkemizde en yenisi NTVMSNBC'nin yeni vermeye başladıgı RSS hizmetidir. Adresi http://tools.ntvmsnbc.com/rss/news.xml . Sanırm bunu bir arkadaşımız ipucu kısmınada yazmıştı. Tabii bu haberler için, spor ve ekonomi için ayrı dosyalar yaratılmıştır.

İsterseniz ilk, RSSi oluşturan XMLin yapısına bi bakalım:

 

  <?xml version="1.0" encoding="ISO-8859-9" ?>
- <rss version="2.0">
- <channel>
  <title>NTVMSNBC - Güncel</title>
  <copyright>Copyright (c) 200 NTVMSNBC</copyright>
  <link>http://www.ntvmsnbc.com</link>
  <description>Türkiye'nin haber portalı NTVMSNBC'den Güncel haberleri</description>
  <language>tr-TR</language>
  <lastBuildDate>09 Temmuz 2005 11:43:32</lastBuildDate>
  <ttl>5</ttl>
- <image>
  <title>NTVMSNBC - Güncel</title>
  <url>http://www.ntvmsnbc.com/global/ntvmsnbclogo.gif</url>
  <link>http://www.ntvmsnbc.com</link>
  <width>79</width>
  <height>81</height>
  <description>NTVMSNBC</description>
  </image>
- <item>
  <title>Van'da feribot kazası: 26 yaralı</title>
  <link>http://www.ntvmsnbc.com/news/332439.asp</link>
  <description />
  <author>webmaster@ntvmsnbc.com</author>
  <guid>NEWS:332439</guid>
  <pubDate>09.07.2005 08:58:00</pubDate>
  </item>
- <item>
  <title>Haluk Koç, Erdoğan'a yüklendi</title>
  <link>http://www.ntvmsnbc.com/news/332423.asp</link>
  <description />
  <author>webmaster@ntvmsnbc.com</author>
  <guid>NEWS:332423</guid>
  <pubDate>08.07.2005 17:52:00</pubDate>
  </item>
- <item>
  <title>Demiryollarında güvenlik artırıldı</title>
  <link>http://www.ntvmsnbc.com/news/332436.asp</link>
  <description />
  <author>webmaster@ntvmsnbc.com</author>
  <guid>NEWS:332436</guid>
  <pubDate>08.07.2005 21:32:00</pubDate>
  </item>
  </channel>
  </rss>


Gördügünüz gibi ilk olarak bir kanal oluşturulmuş(farklı konulu bilgiler tek dosyada olabilmesi için) ve icine bir image bir çok da items konulmuş. Kanal başlıgı ve çeşitli bilgileri gördüğünüz üzere yazılmıştır. RSS in bir kaç versiyonu bulunmaktadır bu versiyonları sırası ile 0.90, 1.0, 0.91, 0.92 ve son olarak 2.0 dır.

Her versiyonda çesitli degişilikler olmustur, Bunları detayları aşagıdaki gibidir (bu liste http://rss-net.sourceforge.net/documents/version_comparison.html alınmıştır )

  • R - gerekli
  • O - opsiyonel
  • N - desteklenmiyor

Dosya Başlıgı

0.90 1.0 0.91 0.92 2.0 DOCTYPE
N N R N N <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

0.90 1.0 0.91 0.92 2.0 RDF
R N N N N <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/">
N R N N N <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">

0.90 1.0 0.91 0.92 2.0 RSS
N N R R R <rss version="{version number}">

0.90 1.0 0.91 0.92 2.0 XML
R R R R R <?xml version="1.0"?>
N <?xml version="1.0" encoding="{character set name}"?>

Channel Elementleri

Channel in içinde olması gerekenler

0.90 1.0 0.91 0.92 2.0 Category
N N N O O <category>
N N N O O domain attribute

0.90 1.0 0.91 0.92 2.0 Cloud
N N N O O <cloud>
N N N O O domain attribute
N N N O O port attribute
N N N O O path attribute
N N N O O registerProcedure attribute
N N N O O protocol attribute

0.90 1.0 0.91 0.92 2.0 Image
O O O O O <image>
R R R R R <title>
R R R R R <url>
R R R R R <link>
N N O O O <description>
N N O O O <width>
N N O O O <height>

0.90 1.0 0.91 0.92 2.0 TextInput
O O O O O <textinput>
R R R R R <title>
R R R R R <description>
R R R R R <name>
R R R R R <link>

Channelin içi

0.90 1.0 0.91 0.92 2.0 Channel
R R R R R <channel>
R R R R R <title>
R R R R R <description>
R R R R R <link>
N N R O O <language>
N N O O O <copyright>
N N O O O <docs>
N N O O O <lastBuildDate>
N N O O O <managingEditor>
N N O O O <pubDate>
N N O O O <rating>
N N O O O <skipDays>
N N O O O <skipHours>
N N N N O <generator>
N N N N O <ttl>

Item nesneleri

0.90 1.0 0.91 0.92 2.0 Category
N N N O O <category>
N N N O O domain attribute

0.90 1.0 0.91 0.92 2.0 Enclosure
N N N O O <enclosure>
N N N R R url attribute
N N N R R length attribute
N N N R R type attribute

0.90 1.0 0.91 0.92 2.0 GUID
N N N N O <guid>
N N N N O isPermaLink attribute

0.90 1.0 0.91 0.92 2.0 Source
N N N O O <source>
N N N R R url attribute

Itemlar

0.90 1.0 0.91 0.92 2.0 Item
R R R R R <item>
R R R O R <title>
N O O O <description>
R R R O O <link>
N N N N O <author>
N N N N O <comments>
N N N N O <pubDate>

Şimdi RSS hakkında yeteri kadar bilgiye sahip olduktan sonra, bunları nasil C# projelerimizde kullanacagımıza bir bakalım. Elbette ki ilk aklınızdan gecen XML dosyasını indirip, parse'lemek ve için gerekli bilgileri almak geçiyordur. Çok dogru ama ben size daha kolay bir öneride bulunacagim, kaynak kodu açık bir .Net library'isi var, ismi RSS.NET. Web adresi : http://rss-net.sourceforge.net/

Ben bu kaynak kodu açık projeyi kullanıcam makalemde. Elbette ki kendimizde parse'leye biliriz ama bu tür toolları kullanmak eger özel bir durum gerektirmiyorsa kesinlikle tercih nedeni olmalıdır.

Gerekli, yani projemize ekleyecegimiz DLL in kaynak kodlarını http://rss-net.sourceforge.net/  adresinden indiriyoruz ve derliyoruz, sitede nedense tar.gz sıkıştırma formatında, ama WinRar sorunsuz acıyor merak etmeyin. Zaten makalenin donwload kısmınıda DLL i ben koyacagım, sizin özel bir degişiklik yapmayacaksanız bu DLL i saf bi şekilde kullana bilirsiniz.

İlk olarak yeni projemize bu derledigimiz DLL i solution explorerden "Add reference" ile ekliyoruz.
Ekledikten sonra elbette cs dosyamızın uzay ismi tanımladıgımız kısmınada

    using
Rss;
eklemeyi unutmuyoruz.

İlk olarak bir hedefdeki RSS nasıl okunur ona bir bakalım isterseniz;

 

Gördügünüz gibi adres çubugumuz, getir botunumuz, listbox'umuz, labelimiz ve bir pictureboxumuz var.

Listboxda channeldaki itemleri listeyecegiz, labelde description ve link'i, picture boxda ise RSS hizmetini veren yerin resmini goruntulecegiz.

      private void button1_Click(object sender, System.EventArgs e)            {
            //tek satır ile okuma işlemini gerçekleştiriyoruz
            //txt_adres in içinde adresimiz yaziyor                              //mesela http://tools.ntvmsnbc.com/rss/news.xml
            RssFeed feed = RssFeed.Read(txt_adres.Text);
            //Okudugunum RSS in icindeki kanalları aliyoruz
            //genelde 0. kanal sıklıkla kullanılıyor, farklı konular için farkli RSS
dosyaları oluşturuluyor.
            for(int i=0; i<feed.Channels.Count; ++i)
                  {
                   //yeni kanalı oluşturuyorz
                   RssChannel channel = (RssChannel)feed.Channels[i];
 //resimi göstermek için
                     pictureBox1.Height=channel.Image.Height;
                     pictureBox1.Width=channel.Image.Width;
                     //RSS in icindeki resim adresini aliyoruz-unutmamanız gereken sey uzay ismine System.Net yazmanız
                     WebRequest req = WebRequest.Create(channel.Image.Url.ToString());
                     WebResponse rep = req.GetResponse();
                     //ve goruntuluyorz
                     pictureBox1.Image = Image.FromStream(rep.GetResponseStream());
                     //icerigi gorutuluyorz
                     listBox1.DataSource = channel.Items;
                  }
            }
 

Diger kısım ise haberlerin üstüne tıklanıldıgında linkin ve açıklamasının görüntülenmesi, bunun icin listbox un SelectedIndexChanged eventini kulanıcaz;

 

                  private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)

            {
                        RssItem item = (RssItem)listBox1.SelectedItem;

                        label2.Text = item.Description + item.Link;
            }


 

Ve işte son hali çalışır hali;

 

 

 

Sanırm okuma olayı bu kadar yeterli, sıra da kendi RSS imi nasıl oluşturabilir o var;

 

private void button1_Click(object sender, System.EventArgs e)
            {
                  //yeni kanalımız
                  RssChannel channel = new RssChannel();
                  //kanalın özellikleri
                  channel.Title = textBox1.Text;
                  channel.Description = textBox2.Text;
                  channel.LastBuildDate = Convert.ToDateTime(textBox3.Text);
                  //link uri olmak zorunda
                  Uri lnkc = new Uri(textBox7.Text);
                  channel.Link=lnkc;
                  //sırada kanalın nesnlerini oluşturmak var
                        RssItem item = new RssItem();
                        //ozellikleri
                        item.Title = textBox4.Text;
                        item.Description = textBox5.Text;
                        Uri lnk = new Uri(textBox6.Text);
                        item.Link = lnk;
                        //ekliyourz
                        channel.Items.Add(item);
                  //bu kadarr..
     
            RssFeed feed = new RssFeed();
                  feed.Channels.Add(channel);
                  //dosya cıktısı             
                  feed.Write(channel.Title+".xml");                
           }

İşte oluşan XML dosyası:

 

  <?xml version="1.0" encoding="iso-8859-1" ?>
- <rss version="2.0">
- <channel>
  <title>1</title>
  <description>2</description>
  <link>http://www.celiker.com/</link>
  <lastBuildDate>Sat, 01 Jan 2005 00:00:00 GMT</lastBuildDate>
  <docs>http://backend.userland.com/rss</docs>
  <generator>RSS.NET: http://www.rssdotnet.com/</generator>
- <item>
  <title>YazGeliştir</title>
  <description>Harika  makaleler</description>
  <link>http://www.yazgelistir.com/</link>
  </item>
  </channel>
  </rss>

 


Elbetteki bu örnek bir nesneli(item) bir kanal için yaptik, bu bir döngü ile item sayısı ihtiyaca gore arttırılabilir. Web'i daha anlamlı kılmak adına yapılan çalışmaları okuyunca, aklıma gelen ilk isim sevgili hocam Assoc. Prof. Dr. Atilla ELÇİ dir. Kendisinin Semantic Web ile ile çalışmaları devam etmektedir. Bu konu ile ilgili çalışmalarını http://cmpe.emu.edu.tr/aelci/ adresinden takip edebilirsiniz.

 

Herkese çalışmalarında kolaylıklar, ve bol başarı diliyorum...

Proje kaynak kodları + RSS.NET DLL