PDA

View Full Version : آموزش: Rss Reader در 5 دقیقه



kingtak
پنج شنبه 28 دی 1391, 22:21 عصر
با اجازه اساتید میخوام طریقه ساخت یه فید ریدر ساده رو آموزش بدم.
من خودم خیلی وقت بود دنبال همچین چیزی بودم تو انجمن هم بار ها دیدم خیلیا دنبالشن.البته من خودم هم توی یه سایت خارجی این آموزش رو دیدم گفتم بد نیست یه نگا بهش بکین...



98560
خوب...
فید ریدر ما با استفاده از کلاس SyndicationFeed کار میکنه.شما با این کلاس میتونید با یه کد کوچیک فیدهای هر سایتی رو که دوست دارید رو بخونید.

using زیر رو به برننامه تون اضافه کنید:

using System.ServiceModel.Syndication;

بذارید اول با یه کد ساده توی محیط Console این کار رو نشونتون بدم:


string url = "http://www.prolearn-vs.com/feed";
using (XmlReader reader = XmlReader.Create(url))
{
SyndicationFeed feed = SyndicationFeed.Load(reader);
Console.WriteLine(feed.Title.Text);
Console.WriteLine(feed.Links[0].Uri);
foreach(SyndicationItem item in feed.Items)
{
Console.WriteLine(item.Title.Text);
}
}




خیلی راحته،مگه نه؟

خوب حالا میخواهیم یه فید ریدر گرافیکی توی WPF درست کنیم.
کد XAML ما به اینصورت خواهد بود:


<Window x:Class="TestFeeds.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Minimalist feed reader" Height="286" Width="531">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0">
<Button Name="btnGo"
DockPanel.Dock="Right"
Width="50"
Content="Go"
Click="btnGo_Click" />
<TextBox Name="txtUrl" />
</DockPanel>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListBox Name="lstFeedItems"
Grid.Column="0"
DisplayMemberPath="Title.Text" />
<GridSplitter Grid.Column="1"
VerticalAlignment="Stretch"
Width="3"
ResizeBehavior="PreviousAndNext"
ResizeDirection="Columns"/>
<Frame Name="frmContents"
Source="{Binding SelectedItem.Links[0].Uri, ElementName=lstFeedItems}"
Grid.Column="2"
NavigationUIVisibility="Visible">
</Frame>
</Grid>
</Grid>
</Window>




حالا به پنجره Design برگردید و روی دکمه Go دوبار کلیک کنید تا کد رویداد دکمه تولید بشه و کد زیر رو داخل کد دکمه قرار بدید..

using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(txtUrl.Text)) {
SyndicationFeed feed = SyndicationFeed.Load(reader);
lstFeedItems.ItemsSource = feed.Items;
}


حالا کدتون رو اجرا کنید و آدرس فید یه سایتی رو وارد کنید و دکمه GO رو کلیک کنید....
میبینید که برنامه به درستی کار میکنه.
به همین سادگی به همین خوشمزگی!!!!
امید وارم مطلب مفیدی بوده باشه.

plus
جمعه 29 دی 1391, 02:30 صبح
جالب بود...مارو براش برای یک پروژه نشتیم دستی RSS Reader نوشتیم...:-D

meysampaknahad
دوشنبه 02 بهمن 1391, 19:01 عصر
سلام
ممنون به خاطر آموزش
این آموزش برای سایت های مختلف با مشکل مواجه میشه. مثلاً برای سایت زیر

string url = "http://www.farsnews.com/rss.php";

یا این :

string url = "http://www.khabaronline.ir/feed";

خطای :

Error in line 12 position 41. An error was encountered when parsing a DateTime value in the XML.

رو نشون میده
راه حلی دارید؟

plus
دوشنبه 02 بهمن 1391, 19:43 عصر
سلام
ممنون به خاطر آموزش
این آموزش برای سایت های مختلف با مشکل مواجه میشه. مثلاً برای سایت زیر

string url = "http://www.farsnews.com/rss.php";

یا این :

string url = "http://www.khabaronline.ir/feed";

خطای :

Error in line 12 position 41. An error was encountered when parsing a DateTime value in the XML.

رو نشون میده
راه حلی دارید؟
تاریخ استفاده شده توی این فید 1391/11/02 - 16:15:00 استاندارد نیست و DateTime.Parse نمیتونه Parse ش کنه.

meysampaknahad
دوشنبه 02 بهمن 1391, 21:09 عصر
تاریخ استفاده شده توی این فید 1391/11/02 - 16:15:00 استاندارد نیست و DateTime.Parse نمیتونه Parse ش کنه.


خب راه حل؟

plus
دوشنبه 02 بهمن 1391, 21:14 عصر
طبیعتا یک راه حل، Parse دستی فید هست.راه دوم میتونی اینه باشه که قبل از ایکنه محتویات فید به SyndicationFeed داده بشه، فقط تاریخ ها به طور دستی پردازش و تصحیح بشن.

meysampaknahad
دوشنبه 02 بهمن 1391, 21:19 عصر
طبیعتا یک راه حل، Parse دستی فید هست.راه دوم میتونی اینه باشه که قبل از ایکنه محتویات فید به SyndicationFeed داده بشه، فقط تاریخ ها به طور دستی پردازش و تصحیح بشن.


میشه با یه مثلا توضیح بدید؟
خاصیتی برای ویرایش تاریخ پیدا نکردم

plus
دوشنبه 02 بهمن 1391, 21:40 عصر
خاصیتی وجود نداره، شما باید یا با استفاده از روش های کار با XML یا با استفاده از Regular Expressions، متن RSS رو قبل از ارسال به SyndicationFeed ، ویرایش کنید.این یک قسمت از RSS این سایت هست:


<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Fars News Agency</title><link>http://www.farsnews.com/</link><description>Fars News Agency (FNA) RSS service</description><language>Fa</language><image><url>http://www.farsnews.com/shares/img/PLogo.jpg</url><title>Fars News Agency</title><link>http://www.farsnews.com/</link><width>190</width><height>59</height><description>Fars News Agency (FNA) RSS service</description></image><copyright>Copyright 2013, Fars News Agency.</copyright><managingEditor>info@farsnews.ir</managingEditor><webMaster>morsali@farsnews.ir</webMaster><lastBuildDate>الإثنين, 21 جانفييه 2013 20:13:32</lastBuildDate><item><title>از صدور کیفرخواست برای اخلال گران بازار ارز تا اشد مجازات برای اوباش محارب</title><description>خبرگزاری فارس: در چهل و سومین نشست خبری سخنگوی قوه قضاییه به مسائل مختلفی از جمله صدور کیفرخواست برای اخلال‌گران بازار ارز و اشد مجازات برای اوباش محارب پرداخته شد.</description><link>http://www.farsnews.com/newstext.php?nn=13911102001149</link><pubDate>1391/11/02 - 17:25:00</pubDate></item><item><title>کمک نوروزی مجلس و دولت به دهک‌های پایین/ روش پرداخت به زودی تعیین می‌شود</title><description>خبرگزاری فارس: یکی از اعضای کمیته مشترک اقتصادی مجلس و دولت با بیان اینکه 2 قوه درباره نفس کمک به دهک‌های پائین جامعه به توافق رسیده‌اند، گفت:‌ به‌زودی درباره روش کمک تصمیم‌گیری نهایی خواهد شد.</description><link>http://www.farsnews.com/newstext.php?nn=13911102000764</link><pubDate>1391/11/02 - 14:17:00</pubDate></item><item>

شما باید با یکی از روش هایی که گفتم (ترجیحا XML) محتوای تگ های pubDate رو پردازش کنی و به فرمتی که DateTime بتونه Parse کنه در بیاری و بعد از این پردازش، مقدار رو به کلاس SyndicationFeed بدید. در صورتی که بازم خطا ایجاد شد، باید تگ های دیگه ای که تاریخ نگه میدارن مثل lastBuildDate رو هم پردازش کنید.

meysampaknahad
دوشنبه 02 بهمن 1391, 21:50 عصر
خاصیتی وجود نداره، شما باید یا با استفاده از روش های کار با XML یا با استفاده از Regular Expressions، متن RSS رو قبل از ارسال به SyndicationFeed ، ویرایش کنید.این یک قسمت از RSS این سایت هست:


<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Fars News Agency</title><link>http://www.farsnews.com/</link><description>Fars News Agency (FNA) RSS service</description><language>Fa</language><image><url>http://www.farsnews.com/shares/img/PLogo.jpg</url><title>Fars News Agency</title><link>http://www.farsnews.com/</link><width>190</width><height>59</height><description>Fars News Agency (FNA) RSS service</description></image><copyright>Copyright 2013, Fars News Agency.</copyright><managingEditor>info@farsnews.ir</managingEditor><webMaster>morsali@farsnews.ir</webMaster><lastBuildDate>الإثنين, 21 جانفييه 2013 20:13:32</lastBuildDate><item><title>از صدور کیفرخواست برای اخلال گران بازار ارز تا اشد مجازات برای اوباش محارب</title><description>خبرگزاری فارس: در چهل و سومین نشست خبری سخنگوی قوه قضاییه به مسائل مختلفی از جمله صدور کیفرخواست برای اخلال‌گران بازار ارز و اشد مجازات برای اوباش محارب پرداخته شد.</description><link>http://www.farsnews.com/newstext.php?nn=13911102001149</link><pubDate>1391/11/02 - 17:25:00</pubDate></item><item><title>کمک نوروزی مجلس و دولت به دهک‌های پایین/ روش پرداخت به زودی تعیین می‌شود</title><description>خبرگزاری فارس: یکی از اعضای کمیته مشترک اقتصادی مجلس و دولت با بیان اینکه 2 قوه درباره نفس کمک به دهک‌های پائین جامعه به توافق رسیده‌اند، گفت:‌ به‌زودی درباره روش کمک تصمیم‌گیری نهایی خواهد شد.</description><link>http://www.farsnews.com/newstext.php?nn=13911102000764</link><pubDate>1391/11/02 - 14:17:00</pubDate></item><item>

شما باید با یکی از روش هایی که گفتم (ترجیحا XML) محتوای تگ های pubDate رو پردازش کنی و به فرمتی که DateTime بتونه Parse کنه در بیاری و بعد از این پردازش، مقدار رو به کلاس SyndicationFeed بدید. در صورتی که بازم خطا ایجاد شد، باید تگ های دیگه ای که تاریخ نگه میدارن مثل lastBuildDate رو هم پردازش کنید.


برای اینکار باید فایل XML هر سایتی رو که میخام از اطلاعات RSSاش استفاده کنم ذخیره کنم و بعد از پردازش ازش استفاده کنم درسته؟

plus
دوشنبه 02 بهمن 1391, 21:54 عصر
برای اینکار باید فایل XML هر سایتی رو که میخام از اطلاعات RSSاش استفاده کنم ذخیره کنم و بعد از پردازش ازش استفاده کنم درسته؟
بله، البته خیلی از سایت ها استاندارد عمل میکنن ولی RSS این سایت استاندارد نیست که همچین مشکلی ایجاد شده.

aradrobo
سه شنبه 24 بهمن 1391, 18:43 عصر
لطفاً نمونه برنامه ساخته شده را برایم ایمیل کنید . منظور از برنامه به همراه سورس می باشد . با تشکر :
Robowar1@yahoo.com

hossein_sh2008
سه شنبه 24 بهمن 1391, 23:35 عصر
سلام
کسی از دوستان این رو در اپلیکیشن برنامشو ننوشته ،نه با wpf اپلیکیشن

ممنون میشیم اگر گسی در اختیار دوستان قرار بدن

با تشکر

danialafshari
چهارشنبه 25 بهمن 1391, 00:15 صبح
درستش کردم جالب بود. مرسی