【问题标题】:linq NullReferenceException questionlinq NullReferenceException 问题
【发布时间】:2011-02-02 01:49:00
【问题描述】:

我有一个对 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; }
}

【问题讨论】:

  • 你的where 子句应该是小写的。

标签: linq


【解决方案1】:

genre.Attribute("url") 返回null,因为没有url 属性。
你需要打电话给Element,而不是Attribute

编辑:调用 dataDoc.Descendants("genres") 返回单个 &lt;genres&gt; 元素,这不是您想要的。
您需要调用 Descendants("genre")(单数)来获取单独的 &lt;genre ...&gt; 元素。
您也可以调用dataDoc.Descendants("genres").Elements 来获取&lt;genres&gt; 元素中的元素。

【讨论】:

  • 好收获。我做了那个(愚蠢的错误)更正,但我仍然得到相同的结果。我还删除了 where 子句,没有任何区别。
  • 啊哈!编辑是不同的!我认为我需要花一些高质量的时间来学习不仅仅是 Linq 的基础知识。非常有用的技术。感谢您的帮助!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多