2014-04-29 21 views
0

我试图将xml转换转换为linq,但我在检索元素的数据之前无法检查元素是否为null。我确信我的下面的代码是正确的,但其中一个xml行缺少元素“ElementOne”,它是子元素“Element”,所以它在执行时抛出整个脚本。转换为linq时检查可空的xml值的问题

这段代码不完整,但这是导致整个脚本出错的部分,任何人都可以知道为什么会出错?

from c in s.Element("ElementOne").Elements("ElementTwo") 
    where s.Element("ElementOne") != null && 
      s.Element("ElementOne").Elements("ElementTwo") != null 
       select new{ 
        Id = (c.Attribute("Id") == null) ? 0 : (int)c.Attribute("Id") 
       } 

回答

1

我只是将其更改为:

var query = s.Elements("ElementOne").Elements("ElementTwo") 
      .Select(c => (int?) c.Attribute("Id") ?? 0); 

(?除非你真的需要匿名类型,何必理会它)

如果没有ElementOne元素,这只会给你一个空的结果。

如果你只想使用即使有多个的第一ElementOne元素,你可以使用:

var query = s.Elements("ElementOne").Take(1).Elements("ElementTwo") 
      .Select(c => (int?) c.Attribute("Id") ?? 0);