我有一个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; }
}
答案 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
属性,然后冗余地转换为字符串。如果只是将XAttribute
或XElement
强制转换为字符串,那么如果原始引用为null,则结果也将为null,而不是抛出异常。使用Value
和投射是没有意义的。