Dùng Syndication đọc RSS trên WP7

Đọc tin tức là nhu cầu thiết yếu của mọi người. Và bạn có thể phát triển một ứng dụng đọc RSS rất dễ dàng với bài hướng dẫn sau đây!

Add references sau:

1. System.ServiceModel.Syndication.dll

(C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\)

2. System.Xml.dll

(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\)

3. System.Xml.Linq.dll

(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\)

4. Mở Tool > Library Package Manager > Package Manager Console > chạy đoạn lệnh này (để sử dụng asynchronous trên WP7):

Install-Package Microsoft.Bcl.Async -Pre

Code:

ListBox chứa các items:

<ListBox x:Name="rssNews">
	<ListBox.ItemTemplate>
		<DataTemplate>
			<Grid Width="{Binding ElementName=mainItems, Path=ActualWidth}" Height="240″ Tap="item_Tap" Margin="20,10,20,10″>
				<Grid.Background>
					<ImageBrush Stretch="Fill" ImageSource="{Binding Summary.Text, Converter={StaticResource getImage}}“/>
				</Grid.Background>
				<Image Source="{Binding Summary.Text, Converter={StaticResource getImage}}"/>
				<Grid Background="#CC34CEE6″ Height="80″ VerticalAlignment="Bottom">
					<TextBlock Text="{Binding Title.Text}" TextWrapping="Wrap" Margin="12,10,12,0″ Foreground="White" FontSize="30″ TextTrimming="WordEllipsis"/>
				</Grid>
			</Grid>
		</DataTemplate>
	</ListBox.ItemTemplate>
</ListBox>

Các bạn lưu ý: vì SyndicationItem không chứa property của image bài viết, nên bạn phải có một hàm để lọc image trong SyndicationItem.Summary.Text (chứa phần Description của một bài RSS):

	public class getImage : IValueConverter

    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null) return null;

            string imageLink = "";
            try
            {
                imageLink = value.ToString().Substring("..."); // các bạn xem mã nguồn của một bài RSS để lọc ảnh trong Description ra bằng Regex hay substring, remove gì cũng được, nhưng cuối cùng phải set cho imageLink có dạng imageLink = "http:// abc.com/123.jpg"
            }
            catch
            {

            }
            return imageLink ;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Add Resources cho hàm getImage vào App.xaml:

<Application.Resources>
<converter:getImage xmlns:converter="clr-namespace:projectname" x:Key="getImage"> // sửa projectname lại nhé
</Application.Resources>

Code binding dữ liệu vào listbox:

        protected async override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            try
            {
                WebClient wc = new WebClient();
                string xmlFeedData = await wc.DownloadStringTaskAsync(new Uri("http:// abc.com/news.rss"));
                StringReader stringReader = new StringReader(xmlFeedData);
                XmlReader xmlReader = XmlReader.Create(stringReader);
                SyndicationFeed feed = SyndicationFeed.Load(xmlReader);

                rssNews.ItemsSource = feed.Items.ToList<SyndicationItem>();
            }
            catch
            {
            }
        }

Cuối cùng là sự kiện Tap lên item:

        public static SyndicationItem si;
        private void item_Tap(object sender, GestureEventArgs e)
        {
            si = new SyndicationItem();
            si = (sender as Grid).DataContext as SyndicationItem;

            NavigationService.Navigate(new Uri("/ViewPage.xaml", UriKind.Relative)); //qua ViewPage.xaml các bạn gọi MainPage.si.Links.FirstOrDefault().Uri để lấy URL bài viết và navigate vào một cái WebBrowser hay gì đó là ý tưởng của bạn nhé
        }
Vậy là bạn đã có một ứng dụng đọc RSS trên Windows Phone rồi, rất đơn giản đúng không?

Chúc các bạn thành công!

6 bình luận về “Dùng Syndication đọc RSS trên WP7

  1. bạn có thể giải thích thêm chỗ : (các bạn xem mã nguồn của một bài RSS để lọc ảnh trong Description ra bằng Regex hay substring, remove gì cũng được, nhưng cuối cùng phải set cho imageLink có dạng imageLink = “http:// abc.com/123.jpg”)
    mình chưa hiểu lắm. thank !

  2. hi bạn, bạn để ý trong một cấu trúc của RSS Item có dạng

    <item>
        <title>Microsoft mua lại Nokia</title>
        <link>www.thongtincongnghe.com/abc</link>
        <description><img src="vtcdn.com/sites/default/files/imagecache/s72/images/2013/3/22/img-1363908268-1.jpg" align="left" style="margin-right:5px"/>Vừa qua tập đoàn Microsoft đã...
        </description>
    </item>
    

    nghĩa là bạn phải làm sao để lấy ảnh trong tag “Description” ra, mình ví dụ ở đây là:

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null) return null;
     
            string imageLink = "";
            try
            {
                imageLink = value.ToString().Remove(value.ToString().IndexOf(".jpg") + 4);
                imageLink = imageLink.SubString(imageLink.IndexOf("src=\"") + 5);
            }
            catch
            {
     
            }
            return imageLink ;
        }
    

    Cuối cùng nó sẽ lấy ra được ảnh: http://vtcdn.com/sites/default/files/imagecache/s72/images/2013/3/22/img-1363908268-1.jpg

    Ảnh này sẽ tự binding vô XAML theo cấu trúc XAML mình đề cập ở “ListBox chứa các Items” nha bạn!

    Bạn có thể tham khảo ứng dụng Tin Công Nghệ sẽ thấy được mỗi bài viết sẽ có một hình ảnh đại diện:
    http://www.windowsphone.com/vi-vn/store/app/tin-c%C3%B4ng-ngh%E1%BB%87/e56f59d1-3574-467e-8e46-251842e2fd11

    Chúc bạn thành công!

  3. Bạn ơi cho mình hỏi thêm một chút có nhiều link nó bị lỗi là nó bị sao vậy(link của genk…..). có link thì chạy tốt nhưng không load được hình ảnh , có link thì chạy có hình ảnh, như link của vietnamnet hặc của tinhte thì được

Gửi phản hồi cho maitrunghieuit Hủy trả lời