0

我是整个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)
{
    //...
}

只要标签有一个有效的值,一切都很好。但是,如果标记的值不是 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>
4

1 回答 1

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,
        }
    );
于 2013-04-30T05:12:33.753 回答