NullReferenceException when Linq'ing IEnumerable<XEle
本文关键字:IEnumerable lt XEle ing when Linq NullReferenceException | 更新日期: 2023-09-27 18:11:39
我对整个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的值在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>
尝试使用另一个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,
}
);