linq NullReferenceException问题

时间:2011-02-01 16:57:25

标签: linq

我有一个XML数据集的linq查询,执行时会生成NullReferenceException。

XDocument dataDoc = XDocument.Load(new StringReader(e.Result));

var Genres = from genre in dataDoc.Descendants("genres")
  where (!genre.Element("ID").IsEmpty)
  select (string)genre.Element("id").Value + ',' + (string)genre.Attribute("name").Value + ',' + (string)genre.Attribute("url").Value;

foreach (string myGenre in Genres)
{
}

执行时,Linq查询工作正常,但是当代码尝试遍历foreach循环时,会发生NullReferenceException。

现在,我认为该问题与我正在阅读的XML数据有关,如下所示:

<genres>
  <translated>true</translated>
  <genre name="1">
    <id>28</id>
    <url>http://url1</url>
  </genre>
  <genre name="2">
    <id>12</id>
    <url>http://url2</url>
  </genre>
</genres>

结构不同的第一个子节点是否会导致问题? 我背后的课不应该是一个问题,而是以下(以防万一):

public class Genre
{
    public string ID { get; set; }
    public string Name { get; set; }
    public string URL { get; set; }
}

2 个答案:

答案 0 :(得分:3)

genre.Attribute("url")返回null,因为没有url属性 您需要致电Element,而不是Attribute

编辑:致电dataDoc.Descendants("genres")会返回单个<genres>元素,这不是您想要的。
您需要致电Descendants("genre")(单数)以获取各个<genre ...>元素 您也可以调用dataDoc.Descendants("genres").Elements来获取<genres>元素中的元素。

答案 1 :(得分:1)

SLaks指出使用Attribute而不是Element的错误,但是您可以在代码中进行另一项改进。目前,您正在使用Value属性,然后冗余地转换为字符串。如果只是XAttributeXElement强制转换为字符串,那么如果原始引用为null,则结果也将为null,而不是抛出异常。使用Value 投射是没有意义的。

相关问题