Linq'ing IEnumerable <xelement> </xelement>时的NullReferenceException

时间:2013-04-30 05:03:21

标签: c# linq lambda nullreferenceexception

我是整个Linq游戏的新手,所以请原谅我的无知。

我这里有这段代码:

String tag = "Covers";
XDocument doc = XDocument.Load(file);
IEnumerable<XElement> allDvds = doc.Element("Collection").Elements("DVD");
IEnumerable<XElement> filteredDvds = allDvds.Where(dvd => dvd.Element("Locks").Element(tag).Value == "true");
var dvdInfos = filteredDvds.Select(dvd => new
            {
                Name = dvd.Element("Title").Value,
                UPC = dvd.Element("UPC").Value,
                ID = dvd.Element("ID").Value,
            }
        );
foreach (var dvdInfo in dvdInfos)
{
    //...
}

只要tag有一个有效的值,一切都很好。但是如果tag的值不是XML中的标记,那么当他尝试启动foreach循环时,我会得到NullReferenceException。

我尝试了if (dvdInfos.Count() > 0)但是我在那里得到了NRE。

我也尝试了if (filteredDvds.Count() > 0)但又是NRE。

有什么建议吗?或者是实际捕获NRE并从那里继续前进的唯一方法?

这是XML:

<?xml version="1.0" encoding="windows-1252"?>
<Collection>
  <DVD>
    <ProfileTimestamp>2012-12-08T17:39:16.000Z</ProfileTimestamp>
    <ID>4030521726802.5</ID>
    <UPC>4-030521-726802</UPC>
    <Title>The Amazing Spider-Man</Title>
<!-- ... -->
    <Locks>
      <Entire>false</Entire>
      <Covers>false</Covers>
      <Title>true</Title>
      <MediaType>true</MediaType>
      <Overview>false</Overview>
      <Regions>false</Regions>
      <Genres>true</Genres>
      <SRP>true</SRP>
      <Studios>true</Studios>
      <DiscInformation>true</DiscInformation>
      <Cast>true</Cast>
      <Crew>true</Crew>
      <Features>false</Features>
      <AudioTracks>false</AudioTracks>
      <Subtitles>false</Subtitles>
      <EasterEggs>false</EasterEggs>
      <RunningTime>false</RunningTime>
      <ReleaseDate>true</ReleaseDate>
      <ProductionYear>false</ProductionYear>
      <CaseType>false</CaseType>
      <VideoFormats>false</VideoFormats>
      <Rating>false</Rating>
    </Locks>
  </DVD>
</Collection>

1 个答案:

答案 0 :(得分:1)

尝试使用另一个Where子句而不是.Element(tag).Value。您将获得nullreferenceexception,因为您没有在该元素上使用linq查询并直接访问它。

尝试这样的事情:

String tag = "Covers";
XDocument doc = XDocument.Parse(xml);
IEnumerable<XElement> allDvds = doc.Element("Collection").Elements("DVD");
IEnumerable<XElement> filteredDvds = allDvds.Where(
  dvd => dvd.Element("Locks") != null && 
  dvd.Element("Locks").Element(tag) != null && 
  dvd.Element("Locks").Element(tag).Value == "true");

var dvdInfos = filteredDvds.Select(dvd => new
        {
            Name = dvd.Element("Title").Value,
            UPC = dvd.Element("UPC").Value,
            ID = dvd.Element("ID").Value,
        }
    );