获取网址<img src=""/>的RSS订阅源并在xaml Windows Phone中的<img/>上打开

时间:2013-06-06 17:02:18

标签: c# windows-phone-7 rss feed

我有这堂课:

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; }
    }

我需要获取标记http://www.unnu.com/feed内的标记,并在列表中的主页上打开此地址以及其他数据。这是我正在使用的代码。它编译但在我看来他总是空着。

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;
    }

这样可行,但屏幕上没有任何内容。有谁知道为什么?

我的列表框保持不变。


没有任何错误。

<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>

1 个答案:

答案 0 :(得分:1)

解析图像URL的启发式算法很脆弱,你应该使用正则表达式:

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