Проблема динамического добавления элементов XML в список, C #? - PullRequest
2 голосов
/ 01 августа 2011

Я получаю фиды для своего проекта RSS, и у меня возникает проблема, связанная с незнанием того, как разрешить пользователю загружать больше элементов в коллекцию. В настоящий момент все загружается сразу. Хотя в некоторых случаях все в порядке, я бы хотел, чтобы пользователь мог выбирать способ загрузки данных в случае медленного мобильного соединения.

Это заимствованный код, и поэтому он только добавляет мне путаницы.

Где я мог бы вставить код в этот образец, чтобы обеспечить динамическую загрузку элементов, скажем, 30 одновременно?

Класс Rss:

namespace MyRSSService
{ 

public class RssService
{
    /// Gets the RSS items.
    /// <param name="rssFeed">The RSS feed.</param>
    /// <param name="onGetRssItemsCompleted">The on get RSS items completed.</param>
    /// <param name="onError">The on error.</param>
    public static void GetRssItems(string rssFeed, Action<IList<RssItem>> onGetRssItemsCompleted = null, Action<Exception> onError = null, Action onFinally = null)
    {
        WebClient webClient = new WebClient();

        // register on download complete event
        webClient.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)
        {
            try
            {
                // report error
                if (e.Error != null)
                {
                    if (onError != null)
                    {
                        onError(e.Error);
                    }
                    return;
                }

                // convert rss result to model
                IList<RssItem> rssItems = new List<RssItem>();                   
                Stream stream = e.Result;
                XmlReader response = XmlReader.Create(stream);
                {
                    SyndicationFeed feeds = SyndicationFeed.Load(response);

                    foreach (SyndicationItem f in feeds.Items)
                    {
                        RssItem rssItem = new RssItem(f.Title.Text, f.Summary.Text, f.PublishDate.ToString(), f.Links[0].Uri.AbsoluteUri);
                        rssItems.Add(rssItem);
                    }
                }    

                // notify completed callback
                if (onGetRssItemsCompleted != null)
                {
                    onGetRssItemsCompleted(rssItems);
                }
            }
            finally
            {
                // notify finally callback
                if (onFinally != null)
                {
                    onFinally();
                }
            }
        };
        webClient.OpenReadAsync(new Uri(rssFeed));
      }
    }
  }

Класс настройки предметов:

namespace MyRSSService
{
public class RssItem
{
    /// <summary>
    /// Initializes a new instance of the <see cref="RssItem"/> class.
    /// </summary>
    /// <param name="title">The title.</param>
    /// <param name="summary">The summary.</param>
    /// <param name="publishedDate">The published date.</param>
    /// <param name="url">The URL.</param>
    public RssItem(string title, string summary, string publishedDate, string url)
    {
        Title = title;
        Summary = summary;
        PublishedDate = publishedDate;
        Url = url;

        // Get plain text from html
        PlainSummary = HttpUtility.HtmlDecode(Regex.Replace(summary, "<[^>]+?>", ""));
    }
    public string Title { get; set; }
    public string Summary { get; set; }
    public string PublishedDate { get; set; }
    public string Url { get; set; }
    public string PlainSummary { get; set; }
   }
 }

привязка C # к странице для отображения каналов

public partial class FeedPage : PhoneApplicationPage
{
    private const string WindowsPhoneBlogPosts = "http://feeds.bbci.co.uk/news/rss.xml";

    public FeedPage()
    {
        InitializeComponent();
        RssService.GetRssItems(WindowsPhoneBlogPosts, (items) => { listbox.ItemsSource = items; }, (exception) => { MessageBox.Show(exception.Message); }, null);
    }
}

1 Ответ

1 голос
/ 01 августа 2011

Если сервер, на котором размещен канал, не предоставляет API для ограничения количества возвращаемых элементов (например, эта практика используется для Xbox Marketplace), вы будете загружать весь канал, даже если вы решите показывать только часть этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...