Search code examples
c#windows-phone-7rssfeed

get the url <img src=''> a rss feed and open on <image> in xaml Windos Phone


I have this class:

class clsFeed
    {
        public string Title { get; set; }
        public string Summary { get; set; }
        public string PublishDate { get; set; }
        public string Content { get; set; }
        public string Image { get; set; }
        public Uri Link { get; set; }
    }

and I need to get the tag that lies within the tag http://www.unnu.com/feed and open this address on my main page in the list with the other data. This is the code I'm using. It compiles but seems to me he's always been empty.

private void UpdateFeedList(string feedXML)
        {
            // Load the feed into a SyndicationFeed instance
            StringReader stringReader = new StringReader(feedXML);
            XmlReader xmlReader = XmlReader.Create(stringReader);
            SyndicationFeed feed = SyndicationFeed.Load(xmlReader);

            //var counter = feed.Items.Count();
            var lista = feed.Items.ToList().Select(s => new clsFeed
            {
                Title = s.Title.Text,
                Summary = s.Summary.Text,
                PublishDate = s.PublishDate.Date.ToString(),
                Content = "",
                Imagem = s.Summary.Text.Split('<')[5].Replace("img src='", "").Replace("' border='0' />", ""),
                Link = s.Links.FirstOrDefault().Uri
            }).ToList();


                      Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                // Bind the list of SyndicationItems to our ListBox
                feedListBox.ItemsSource = lista;
                feedListBox.ItemsSource = feed.Items;
                //progressIndicator.IsVisible = false;
            });
            //gridProgressBar.Visibility = Visibility.Collapsed;   //Quando atualiza a lista de feeds esconde a progress bar.
            panorama.Visibility = Visibility.Visible;
        }

private void UpdateFeedList(string feedXML)
    {
        // Load the feed into a SyndicationFeed instance
        StringReader stringReader = new StringReader(feedXML);
        XmlReader xmlReader = XmlReader.Create(stringReader);
        SyndicationFeed feed = SyndicationFeed.Load(xmlReader);



        // In Windows Phone OS 7.1, WebClient events are raised on the same type of thread they were called upon. 
        // For example, if WebClient was run on a background thread, the event would be raised on the background thread. 
        // While WebClient can raise an event on the UI thread if called from the UI thread, a best practice is to always 
        // use the Dispatcher to update the UI. This keeps the UI thread free from heavy processing.
        var lista = feed.Items.ToList().Select(s => new clsFeed
        {
            Title = s.Title.Text,
            Summary = s.Summary.Text,
            PublishDate = s.PublishDate.Date.ToString(),
            Content = "",                
            Imagem = Regex.Match(feedXML, @"<img\s+src='(.+)'\s+border='0'\s+/>").Groups[1].Value,
            Link = s.Links.FirstOrDefault().Uri
        }).ToList();




        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            // Bind the list of SyndicationItems to our ListBox
            feedListBox.ItemsSource = lista;


        });

        gridProgressBar.Visibility = Visibility.Collapsed;   //Quando atualiza a lista de feeds esconde a progress bar.
        panorama.Visibility = Visibility.Visible;
    }

This works but nothing appears on the screen. Does anyone know why?

My listbox remains the same.


Dont have any erros.

<ListBox x:Name="feedListBox" HorizontalAlignment="Left" Height="537" Margin="10,72,0,0" VerticalAlignment="Top" Width="398" SelectionChanged="listFeedBox_SelectionChanged" >
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel VerticalAlignment="Top">
                                    <Grid>
                                    <Image Width="400" Height="130" Name="img" Source="{Binding feed.ImageUrl}"/>
                                    </Grid>
                                    <TextBlock TextDecorations="Underline" FontSize="24" Name="feedTitle" TextWrapping="Wrap" Margin="12,0,0,0" HorizontalAlignment="Left" Text="{Binding Title.Text, Converter={StaticResource RssTextTrimmer}}" >
                                        <TextBlock.Foreground>
                                            <SolidColorBrush Color="#FF159DDE"/>
                                        </TextBlock.Foreground>
                                    </TextBlock>
                                    <TextBlock Name="feedSummary" TextWrapping="Wrap" Margin="12,0,0,0" Text="{Binding Summary.Text, Converter={StaticResource RssTextTrimmer}}" />
                                    <TextBlock Name="feedPubDate" Foreground="{StaticResource PhoneSubtleBrush}" Margin="12,0,0,10" Text="{Binding PublishDate}" />
                                    <TextBlock Name="feedContent" Text="{Binding Content}" />
                                </StackPanel>
                           </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

Solution

  • Your heuristic to parse the image URL is brittle, you should use a regex:

    using System.Text.RegularExpressions;
    ...
    Image = Regex.Match(s.Summary.Text, @"<img\s+src='(.+)'\s+border='0'\s+/>").Groups[1].Value,