Использование XML Reader для получения конкретной информации из RSS-канала в winform - PullRequest
2 голосов
/ 23 октября 2019

Я новичок в C #, поэтому я попытаюсь объяснить это в меру своих способностей.

Я создаю простое подкаст-приложение на C # и пытаюсь использовать XML-ридер для полученияRSS-канал, а затем помещая эту информацию в различные winforms.

Я разработал, как получить основную информацию, которую я хочу, в listBox. Однако чего я не могу понять, так это получить другую часть информации (сводку) из RSS-канала в richTextBox, щелкнув элемент списка в listBox.

Класс, который я создал для чтения RSS-канала.

Элемент списка

public class RSSreader
{
    public static List<Tuple<string, string>> rssRead(string url)
    {
        string subject = "";
        string summary = "";
        var x = "";
        var y = "";
        var count = 0;
        var list = new List<Tuple<string, string>>();
        try
        {



            XmlReader reader = XmlReader.Create(url);
            SyndicationFeed feed = SyndicationFeed.Load(reader);
            reader.Close();

            foreach (SyndicationItem item in feed.Items)
            {
                count++;
                subject = item.Title.Text;
                summary = item.Summary.Text;
                x += count + " " + subject + " ";
                list.Add(new Tuple<string, string>("Avsnitt " + count+ " " + subject, summary));

            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
        //Datahandler.SavePodFeed(list);
        return list ;
    }
}

public class RSSreader
{
    public static List<Tuple<string, string>> rssRead(string url)
    {
        string subject = "";
        string summary = "";
        var x = "";
        var y = "";
        var count = 0;
        var list = new List<Tuple<string, string>>();
        try
        {


            //string urlX = "http://feeds.soundcloud.com/users/soundcloud:users:298230954/sounds.rss";
            XmlReader reader = XmlReader.Create(url);
            SyndicationFeed feed = SyndicationFeed.Load(reader);
            reader.Close();

            foreach (SyndicationItem item in feed.Items)
            {
                count++;
                subject = item.Title.Text;
                summary = item.Summary.Text;
                x += count + " " + subject + " ";
                list.Add(new Tuple<string, string>("Avsnitt " + count+ " " + subject, summary));

            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

        return list ;

    }
}

Что я использую для заполнения списка

private void button1_Click(object sender, EventArgs e)
{
    var list = RSSreader.rssRead(tbxURL.Text);
    foreach (Tuple<string, string> item in list)
    {
        listBox2.Items.Add(item.Item1);
    }
    listBox2.Items.Add(RSSreader.rssRead(tbxURL.Text));
}

Мой взгляд на заполнение поля richTextBox из списка со списком при нажатии.

private void listBox2_MouseClick(object sender, MouseEventArgs e)
{
    var list = RSSreader.rssRead(tbxURL.Text);
    foreach (Tuple<string, string> item in list)
    {
        if (item != listBox2.SelectedItem)
        {
            richTextBox1.Text = item.Item2.ToString();
        }
    }
}

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

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Вот несколько указателей:

  • Создайте класс , где вы будете хранить информацию из RSS для каждого элемента (например, MyPodcastEntry.cs со свойствами Index (count),Subject, Summary, ...)
  • Заполните эти классы в rssRead и добавьте их в список
  • Добавьте этот список в список вместо использования Tuple <>
  • Переопределить ToString в этом классе, чтобы настроить способ их отображения в списке

Это поможет вам сохранить и использовать информацию из RSS. Нет необходимости запускать rssRead каждый раз, когда вы щелкаете по списку. После того, как вы прочитали RSS-канал и поместили данные в свой класс, вы можете в любой момент получить доступ к этой информации.

Теперь в вашем обработчике событий MouseClick вы можете получить доступ к SelectedItem списка, cast это для вашего класса, а затем получить доступ к свойствам, которые вы ранее присвоили, чтобы назначить тексту richtextbox, нет необходимости ни в rssRead, ни в цикле.

Необязательный материал:

Есть фуп с C #!

0 голосов
/ 23 октября 2019

У вас есть этот код:

private void listBox2_MouseClick(object sender, MouseEventArgs e)
{
    var list = RSSreader.rssRead(tbxURL.Text);
    foreach (Tuple<string, string> item in list)
    {
        if (item != listBox2.SelectedItem)
        {
            richTextBox1.Text = item.Item2.ToString();
        }
    }
}

Вы пробегаете все пункты, говоря: «Если это не тот дроид, которого я ищу, я добавлю его в RichTextBox». Я думаю, что вы имеете в виду: «Если это тот дроид, которого я ищу, я добавлю его в RichTextBox.

Это будет:

private void listBox2_MouseClick(object sender, MouseEventArgs e)
{
    var list = RSSreader.rssRead(tbxURL.Text);
    foreach (Tuple<string, string> item in list)
    {
        if (item == listBox2.SelectedItem) // Notice the equality operator
        {
            richTextBox1.Text = item.Item2.ToString();
        }
    }
}

Я незнать, если это опечатка с вашей стороны, но оператор равенства равен ==, а не !=.

Ваш код всегда будет отображать последний элемент в списке.

...