2010-08-19 23 views
1

我使用Linq从一些XML中提取值。下面显示的是一个简化的示例,显示我遇到的问题。下面的代码可以在下面显示的XML上正常工作。我遇到的问题是groupBy部分丢失。因为Data.Element("groupBy").Element("property)失踪,因为Data.Element("groupBy")将为空。是否有可能修改我的Linq语句以允许它提供默认值,还是应该以不同的方式处理它?通过Linq获取XML值时设置默认值

var e = (from Data in theXML.Descendants("exportFile") 
select new Export 
{  
    OutputFileName = Data.Element("outputFileName") != null ? (string)Data.Element("outputFileName") : "", 
    GroupByProperty = Data.Element("groupBy").Element("property") != null ? (string)Data.Element("groupBy").Element("property") : "" 
}).First(); 

<exportFile> 
    <outputFileName>output.xml</outputFileName> 
    <groupBy> 
     <property>DeviceId</property> 
    </groupBy> 
</exportFile> 

回答

3

比它使用的是空合并运算符可以使已经稍微更好。然而,为了应付groupby元件是缺少的是更难:

select new Export 
{  
    OutputFileName = (string) Data.Element("outputFileName") ?? "", 
    GroupByProperty = Data.Element("groupBy") == null ? "" 
      : (string) Data.Element("groupBy").Element("property") ?? "" 
}).First(); 

转换为字符串只是返回null如果该元素引用为null。

另一种方法是:

GroupByProperty = 
    (string) Data.Elements("groupBy").Elements("property").FirstOrDefault() ?? "" 

使用扩展方法,它允许你打电话ElementsIEnumerable<XElement> ......这样就(懒洋洋)一个groupBy元素下评估每个property元素的序列在Data下,如果存在,则取其中的第一个,然后应用字符串转换。

+0

我觉得OP在说GROUPBY元素并未在XML存在。如果情况如此,这难道不会失败吗? – 2010-08-19 14:38:26

+0

@Justin:是的,我误读 - 但现在修复:) – 2010-08-19 14:38:51

+0

有趣。当你在调用链上游有一个空值时,我没有意识到你可以使用FirstOrDefault()。每天学些新东西。 – 2010-08-19 14:47:05

0

你可以简单地在声明中添加额外的检查(干净的东西了使用空合并运算符位):

GroupByProperty = Data.Element("groupBy") != null ? 
    (Data.Element("groupBy").Element("property") ?? "") : "";