使用 XML Reader 从 RSS 提要获取特定信息到 winform

Using XML Reader to get specific information from an RSS feed into a winform

我是 C# 的新手,所以我会尽力解释这一点。

我正在用 C# 创建一个简单的播客应用程序并尝试使用 XML-reader 接收 RSS 提要,然后将该信息放入不同的 winforms。

我已经弄清楚如何将我想要的主要信息放入列表框中。 然而,我无法弄清楚的是,通过单击列表框中的列表项,从 RSS 提要中获取另一条信息(摘要)到 richTextBox 中。

我做的class阅读RSS feed。

列表项

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

我对使用摘要 onclick 从 listBox 填充 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。

这里有几点建议:

  • Make a class 存储每个元素的 RSS 信息的位置(例如 MyPodcastEntry.cs 具有索引(计数)、主题、摘要等属性)
  • 将这些 class 填充到您的 rssRead 中并将它们添加到列表中
  • 将该列表添加到列表框中,而不是使用 Tuple<>
  • Override ToString 其中 class 调整它们在列表框中的显示方式

这将帮助您保存和使用来自 RSS 的信息。每次单击列表框时都不需要 运行 rssRead。阅读 RSS 提要并将数据放入 class 后,您就可以随时访问此信息。

现在,在您的 MouseClick 事件处理程序中,您可以访问列表框的 SelectedItem,cast 它到您的 class,然后访问您之前分配的属性,以分配给 richtextbox 文本,不需要 rssRead 或循环。

可选内容:

  • 使用 SelectedIndexChanged 代替 MouseClick 事件
  • bunch of rss feed reader nugets 可用,无需制作您自己的 nvm 您正在使用 Syndication,这很好 :)
  • 干净的代码
    • 未使用的变量 x, y
    • Define variables subject and summary in the foreach 而不是顶部
    • 更好的是,don't use subject and summary variables at all 因为它们的值已经存储在 item.Title.Text 和 item.Summary.Text

玩得开心 C#!

你有这个代码:

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

您 运行 通过所有项目说:"If this is not the droid I'm looking for, I will add it to the 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();
        }
    }
}

不知道是不是你打错了,等号是==,不是!=.

您的代码将始终显示列表中的最后一项。