C#中的NullReferenceException处理XML

时间:2009-06-30 15:49:37

标签: c# xml

我收到NRE错误,上面写着:“对象引用没有设置为对象的实例。”

从以下代码:

  select new
                  {
                      ICAO = station.Element("icao").Value,
                  };

整个脚本是:

XDocument xmlDoc = XDocument.Load(@"http://api.wunderground.com/auto/wui/geo/GeoLookupXML/index.xml?query=94107");

    var stations = from station in xmlDoc.Descendants("station")
                  select new
                  {
                      ICAO = station.Element("icao").Value,
                  };
    lblXml.Text = "";
    foreach (var station in stations)
    {
        lblXml.Text = lblXml.Text + "ICAO: " + station.ICAO + "<br />";
    }

    if (lblXml.Text == "")
        lblXml.Text = "No Results.";
    }

我不明白为什么它没有创建工作站对象并设置ICAO值。有关未来XML和C#参考的任何想法/提示吗?

5 个答案:

答案 0 :(得分:9)

看来只有机场站才有icao元素。这应该适合你:

var stations = from airport in xmlDoc.Descendants("airport")
               from station in airport.Elements("station")
               select new
               {
                   ICAO = station.Element("icao").Value,
               };

您可以改为使用where条件来绕过异常:

var stations = from station in xmlDoc.Descendants("station")
               where station.Element("icao") != null
               select new
               {
                   ICAO = station.Element("icao").Value,
               };

此外,您可以提取这样的值以防止异常,但它会返回您可能需要或可能不需要的大量空记录:

ICAO = (string)station.Element("icao")

您可以为各种其他类型执行此操作,而不仅仅是字符串。

答案 1 :(得分:1)

示例中的XML文件会返回一些没有station后代的icao元素,因此有时station.Element("icao")将返回null。

答案 2 :(得分:0)

我不认为xmlDoc.Descendants("station")正在回归你所期待的。你应该在这里检查结果。这就是为什么station.Element(“icao”)返回null。

答案 3 :(得分:0)

该URL似乎没有返回XML数据,我怀疑这会导致您的节点引用返回空值。

答案 4 :(得分:0)

尝试这样的事情:

var stations = from station in xmlDoc.Elements("station")
select new
{
    ICAO = station.Element("icao").Value,
};