XML Reader抛出了Object Null异常,但节点存在(?!)

时间:2012-06-19 09:02:56

标签: c# wpf xml

我希望有人可以告诉我为什么我会把烦人的 - " xml对象引用设置为一个实例。"错误。

我正在寻找的元素(节点?)似乎存在,我也没有错误拼写:[

我可能会在这里做一些愚蠢的事,但任何帮助都会非常感激。

我的代码:

   private void button1_Click(object sender, RoutedEventArgs e)
{

    XmlDocument reader = new XmlDocument();
    reader.Load("Kotaku - powered by FeedBurner.xml");
    XmlNodeList titles = reader.GetElementsByTagName("title");
    XmlNodeList dates = reader.GetElementsByTagName("pubDate"); 
    XmlNodeList descriptions = reader.GetElementsByTagName("description");
    XmlNodeList links = reader.GetElementsByTagName("link"); 
    for (int i = 0; i < titles.Count; i++)
    {
        textBox1.AppendText(Environment.NewLine + titles[i].InnerText);
        textBox1.AppendText(Environment.NewLine + descriptions[i].InnerText); //<<-- Throws Object Ref Null Exception
        textBox1.AppendText(Environment.NewLine + links[i].InnerText);
        textBox1.AppendText(Environment.NewLine + dates[i].InnerText); //<<-- Throws Object Ref Null Exception

    }  

}

我使用的XML是一个保存的XML页面:http://feeds.gawker.com/kotaku/full

我现在的工作方式如下:我已经从上面的链接(这是一个XML页面)保存了页面并将它放在我的EXE旁边以便于访问。 然后我运行代码。

3 个答案:

答案 0 :(得分:4)

您阅读RSS的方式是错误的。首先获取所有项目并循环每个项目并构建文本。如果您可以使用StringBuilder并最终将其转换为字符串,那就更好了。 在访问对象的属性之前,您可以检查null。

XmlDocument RSSXml = new XmlDocument();
RSSXml.Load("Kotaku - powered by FeedBurner.xml");
XmlNodeList RSSNodeList = RSSXml.SelectNodes("rss/channel/item");
StringBuilder sb = new StringBuilder();
foreach (XmlNode RSSNode in RSSNodeList)
{
    XmlNode RSSSubNode;
    RSSSubNode = RSSNode.SelectSingleNode("title");
    string title = RSSSubNode != null ? RSSSubNode.InnerText : "";
    RSSSubNode = RSSNode.SelectSingleNode("link");
    string link = RSSSubNode != null ? RSSSubNode.InnerText : "";
    RSSSubNode = RSSNode.SelectSingleNode("description");
    string desc = RSSSubNode != null ? RSSSubNode.InnerText : "";
    RSSSubNode = RSSNode.SelectSingleNode("pubDate");
    string pubDate = RSSSubNode != null ? RSSSubNode.InnerText : "";
    sb.Append("<font face='arial'><p><b><a href='");
    sb.Append(link);
    sb.Append("'>");
    sb.Append(title);
    sb.Append("</a></b><br/>");
    sb.Append(desc);
    sb.Append(pubDate);
    sb.Append("</p></font>");
}
textBox1.Text = sb.ToString();

答案 1 :(得分:1)

它不能在for循环中运行,因为标题,描述,链接和日期中的项目数分别是(在我运行时):39 38 39 37。

答案 2 :(得分:0)

我查看了http://feeds.gawker.com/kotaku/full的来源。

我所看到的 - 至少在HMTL源中 - 通道标题中也有<title>个元素。哪个不属于任何项目。当您使用title.Count作为for cicle的限制时,您的代码是否可能会计算一些其他元素?

如果是这种情况,则可能在循环中的其他数组中没有足够的元素。你也检查过这个吗?