PDA

View Full Version : مقاله: ساخت يک خروجی RSS برای سايت شما



baran_mehr
سه شنبه 02 شهریور 1389, 17:44 عصر
RSS يک راه استاندارد برای به اشتراک گذاشتن محتوای سايت ها با ديگران است. RSS يا همان Really Simple Syndication چيزی نيست به جز يک نشانه گذاری استاندارد شده XML که محتوايی که قصد به اشتراک گذاشتن آن را داريد را توصيف می کند. در اين مقاله قصد داريم چگونگی ساخت يک فايل RSS را در ASP.NET بررسی کنيم.

فرمت RSS

همان طور که قبلا اشاره شد RSS چيزی به جز يک XML نشانه گذاری شده با تگ های مخصوص نيست. کد زير يک نمونه ساده RSS را نشان می دهد.



<rss version="2.0">
<channel xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<title>IranASP.NET New Articles RSS Feed</title>
<language>fa-IR</language>
<copyright>(c) 2004 by IranASP.NET</copyright>
<pubDate>Sun, 08 Aug 2004 06:11:37 GMT</pubDate>
<lastBuildDate>Sun, 08 Aug 2004 06:11:37 GMT</lastBuildDate>
<generator>IranASP.NET rss generator</generator>
<item>
<title>کاهش حجم خروجی در ASP.NET</title>
<link>http://www.iranasp.net/articles/showarticle.aspx?articleid=154</link>
<pubDate>Sun, 25 Jul 2004 19:30:00 GMT</pubDate>
</item>
</channel>
</rss>

اجازه بدهيد به تگ های اين سند کمی دقيق تر نگاه کنيم

<rss> : تشکيل دهنده تگ ريشه سند است که شامل نسخه سند RSS هم می باشد. آخرين نسخه RSS نسخه 2 است.

<channel> : گره ريشه سند RSS می تواند تگ <channel> هم داشته باشد. اين تگ هم به نوبه خود می تواند شامل گره های <tile>,<link> و <item> باشد.

<title> : مشخص کننده عنوان سند RSS است.

<link> : اين تگ URL سايت ارايه دهنده RSS را مشخص می کند.

<description> : جزييات و اطلاعات بيشتر مربوط به اين سند را مشخص می کند.

<copyright> : اطلاعات مربوط به کپی رايت سند را مشخص می کند.

<generator> : اين تگ Application ای که اين سند را ساخته معرفی می کند.

علاوه بر تگ های بالا، يک سند RSS می تواند يک يا چند تگ <item> داشته باشد. تگ <item> مشخص کننده همان محتوايی است که می خواهيد به اشتراک بگذاريد مثلا يک مقاله يا يکی از پست های يک وبلاگ. هر تگ <item> به علاوه شامل زيرگره های زير است.

<title> : اين تگ عنوان آيتم را مشخص می کند مثلا عنوان مقاله.

<link> : اين تگ URL آن آيتم را نشان می دهد مثلا آدرس مقاله در وب.

<description> : اين تگ آيتم را توصيف می کند، در مورد يک مقاله می تواند شامل خلاصه مقاله باشد.

<pubDate> : اين تگ تاريخ انتشار آن آيتم را نشان می دهد. فرمت معمول برای نمايش اين تاريخ به صورت Sun, 25 Jul 2004 12:00:00 GMT است.


چگونه يک سند RSS بسازيم ؟

حالا که با ساختار يک فايل RSS آشنا شديد، به سراغ دات نت می رويم. چگونه در دات نت يک فايل RSS بسازيم؟ دات نت مجوعه ای غنی ای از کلاس های مرتبط با XML دارد. برای ساختن فايل RSS ما از کلاس XML Text writer استفاده می کنيم. ولی می خواهيم يک راه حل کلی داشته باشيم که با هر وب سايتی کار کند. معنی اين حرف اين است که کد ما بايد مستقل از يک جدول يا يک فيلد خاص در ديتابيس سايت باشد. برای اين کار ما يک کلاس در VS.NET می سازيم. منبع تگ های <item> سند XML ما هم يک ديتاست است که از جدول دلخواه ما در ديتابيس ساخته می شود. کلاسی که قصد نوشتن آن را داريم ويژگی ها (properties) و متدهای (methods) زير را دارد:


ويژگی ها(properties)

Outputstream : يک شی جريان ( Stream ) که خروجی سند در آن نوشته می شود.

RssTitle : مقدار تگ <title> را در زير تگ <channel> مشخص می کند.

PublisherUrl : مقدار تگ <link> را در زير تگ <channel> مشخص می کند.

Description : مقدار تگ <description> را در تگ <channel> مشخص می کند.

Copyright : مقدار تگ <copyright> را در زير تگ <channel> مشخص می کند.

Generator : مقدار تگ <generator> را در زير تگ <channel> مشخص می کند.

ItemSource : تعيين کننده شی ديتاستی است که سطرهای آيتم را شامل می شود.

ItemTitleField : نام Datacolumn ( ستون داده ای در ديتاست ) که مقدار تگ <title> از تگ <item> را نشان می دهد.

ItemURLField : نام Datacolumn که مقدار تگ <link> از تگ <item> را مشخص می کند.

ItemDescriptionField : نام Datacolumn که مقدار تگ <description> از تگ <item> را معرفی می کند.

ItemPublicationDateField : نام Datacolumn که مقدار تگ <pubDate> از تگ <item> را نشان می دهد.


متدها

PublishRss : اين متد سند نشانه گذاری شده RSS را در Outputstream می نويسد.

در زير کد کامل کلاس RSS را می بينيد، توجه کنيد که برای سادگی و نمايش سريع به جای properties از متغيرهای عمومی ( Public ) استفاده شده است.



Public Class Rss
Public OutputStream As Stream
Public RssTitle As String
Public PublisherUrl As String
Public Description As String
Public Copyright As String
Public Generator As String
Public ItemSource As DataSet
Public ItemTitleField As String
Public ItemUrlField As String
Public ItemDescriptionField As String
Public ItemPublicationDateField As String
Public Shared Function PublishRss(ByVal r As Rss)
Dim writer As New XmlTextWriter(r.OutputStream,
System.Text.Encoding.ASCII)
writer.WriteStartElement("rss")
writer.WriteAttributeString("version", "2.0")
writer.WriteStartElement("channel")
writer.WriteElementString("title", r.RssTitle)
writer.WriteElementString("link", r.PublisherUrl)
writer.WriteElementString("description", r.Description)
writer.WriteElementString("copyright", r.Copyright)
writer.WriteElementString("generator", r.Generator
For Each row As DataRow In r.ItemSource.Tables(0).Rows
writer.WriteStartElement("item")
writer.WriteElementString("title", row(r.ItemTitleField))
writer.WriteElementString("link", row(r.ItemUrlField))
writer.WriteElementString("description",
row(r.ItemDescriptionField))
writer.WriteElementString("pubDate",
CType(row(r.ItemPublicationDateField),
DateTime).ToString("ddd, dd MMM yyyy 12:00:00 tt G\MT"))
writer.WriteEndElement()
Next
writer.WriteEndElement()
writer.WriteEndElement()
writer.Flush()
End Function
End Class

در کد کلاس بالا متد PublishRss مهمترين اتفاقی است که در کلاس می افتد. ابتدا ما يک نمونه از کلاس System.XML.XmlTextwriter ساخته ايم. اين کلاس سريع ترين راه برای نوشتن اسناد XML است. بعد OutputStream را به تابع پاس کرده و encoding سند را مشخص کرديم. در مورد اين کد از ASCII استفاده شده است. بعد از اين شروع به نوشتن بخش های مختلف سند RSS خودمان کرديم. در کلاسXmlTextwriter ما از متدهای زير برای نوشتن سند خودمون استفاده کرديم:

WritestartElement : اين متد تگ شروع را برای يک تگ خاص می نويسد (هر تگ شامل يک تگ شروع هست و يک تگ پايان مثلا <channel> تگ شروع و <channel/> تگ پايان می باشد) .

WriteAttributeString : خواص تگ باز فعلی را می نويسد.

WriteElementString : مقدار هر تگ که بين تگ شروع و تگ پايان قرار دارد را می نويسد.

WriteEndElement : تگ پايان را برای تگی که اخيرا باز بوده می نويسد. نيازی نيست که تگ های داخلی تر را مشخص کنيد.

Flush : اين متد، تمام خروجی های بافرشده را به مقصد منتقل می کند.

توجه کنيد که شما بايد متدهای WriteStartElement و WriteEndElement را برای بهتر شکل دادن به سند خودتان استفده کنيد.


ساختن وب فرم ASP.NET

حالا که يک کلاس کلی نوشتيم، می تونيم از اين کلاس در وب فرم خودمان استفاده کنيم. يک ساختار که به عنوان نمونه می توانيد در بانک اطلاعاتی از آن استفاده کنيد به شکل زير می باشد. از اطلاعات اين ساختار در بانک اطلاعاتی برای ساخت سند RSS استفاده می گردد.


Article_ title - Varchar (255)
Article_ Description -Varchar (1000)
Article_ url - Varchar (255)
Article_ pubdate - DateTime

ما به کمک يک تابع به نام GetDataSet اطلاعات را به ديتاست می دهيم، اين ديتاست به عنوان منبع برای توليد فايل RSS مورد استفاده قرار می گيرد. برای پر کردن ديتاست از يک DataAdapter استفاده می کنيم :



Function GetDataSet() as DataSet
Dim cnn as New SqlConnection("connection string here")
sql = "select * from sometable order by Article_pubdate desc"
Dim da As New SqlDataAdapter(sql,cnn)
Dim ds as New DataSet()
da.Fill(ds,"MyArticles")
Return ds
End Function

برای ايجاد يک خروجی RSS از محتوای سايت، بايد يک نمونه از کلاس Rss که نوشتيم بسازيم، سپس ويژگی های مختلف آن را مقداردهی کنيم و سپس متد GetDataSet را فراخوانی کنيم. بعد از اينکه ديتاست را بدست آورديم فقط کافی است که خصوصيت ItemSource شئ گرفته شده از کلاس Rss را به همين ديتاست مقدار دهيم. به علاوه دو خصوصيت از شئ response يعنی ContentEncoding و ContentType را هم مقدار می دهيم.


Private Sub Page_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
Dim r As New Rss
Dim ds As DataSet = GetDataSet()
r.OutputStream = Response.OutputStream
r.RssTitle = "DotNetBips.com Latest Articles"
r.PublisherUrl = Request.Url.Host
r.Description = "DotNetBips.com - Applying.NET"
r.Copyright = "Copyright (C) DotNetBips.com."
r.Generator = "DotNetBips.com RSS Generator"
r.ItemSource = ds
r.ItemTitleField = "Article_title"
r.ItemDescriptionField = "Article_Description"
r.ItemPublicationDateField = "Article_pubdate"
r.ItemUrlField = "Article_url"
Response.ContentEncoding = System.Text.Encoding.UTF8
Response.ContentType = "text/xml"
Rss.PublishRss(r)
Response.End()
End Sub

حالا تابع PublishRss را فراخوانی می کنيم و شئ گرفته شده از کلاس Rss را به اين تابع پاس می کنيم. تمام شد! حالا يک خروجی XML بر اساس استاندارد RSS داريم.

مبنع: http://www.dotnetbips.com