linq到xml的问题

时间:2010-03-05 17:48:47

标签: c# linq-to-xml

我可能遗漏了一些明显的东西,但是我在Linq to xml查询中得到了一个'对象引用未设置为对象的实例'null错误。

以下是xml

的示例
<airport>
  <station>
  <city>Rutland</city>
  <state>VT</state>
  <country>US</country>
  <icao>KRUT</icao>
  <lat>43.52999878</lat>
  <lon>-72.94999695</lon>
  </station>
</airport>

这是我的查询

XDocument geoLocation = XDocument.Load("myTestGeo.xml");

            var currLocation = from geo in geoLocation.Descendants("airport")
                              select new
                              {
                                  City = geo.Element("city").Value,
                                  State = geo.Element("state").Value,
                                  Country = geo.Element("country").Value,
                                  Station = geo.Element("icao").Value
                                  Lat = geo.Element("lat").Value,
                                  Lon = geo.Element("lon").Value
                              };

我整天都在看这个并尝试过很多东西,但没有运气。有人可以帮助这个密集的程序员吗?

2 个答案:

答案 0 :(得分:1)

城市和所有其他价值观都在车站内,不是机场的直接后代。

或许有一些缩进可以解释这个问题。

<airport>
  <station>
    <city>Rutland</city>
    <state>VT</state>
    <country>US</country>
    <icao>KRUT</icao>
    <lat>43.52999878</lat>
    <lon>-72.94999695</lon>
  </station>
</airport>

这可能有用:

XDocument geoLocation = XDocument.Load("myTestGeo.xml");

var currLocation = from geo in geoLocation.Descendants("station")
                  select new
                  {
                      City = geo.Element("city").Value,
                      State = geo.Element("state").Value,
                      Country = geo.Element("country").Value,
                      Station = geo.Element("icao").Value
                      Lat = geo.Element("lat").Value,
                      Lon = geo.Element("lon").Value
                  };

答案 1 :(得分:0)

Descendants()给出当前节点下任何级别的所有元素,而Element()仅查看当前节点的直接子节点。由于您通过Element()调用请求的所有值均为station而非airport的子项,因此对Element()的调用不会返回任何对象。使用.Value取消引用它们会导致异常。

如果您将查询更改为以下内容,则应该有效:

XDocument geoLocation = XDocument.Load("myTestGeo.xml");

var currLocation = from geo in geoLocation.Descendants("station")
                   select new
                   {
                       City = geo.Element("city").Value,
                       State = geo.Element("state").Value,
                       Country = geo.Element("country").Value,
                       Station = geo.Element("icao").Value
                       Lat = geo.Element("lat").Value,
                       Lon = geo.Element("lon").Value
                   };