我是整个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>
答案 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,
}
);