通过Linq获取XML值时设置默认值
问题描述:
我使用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>
答
比它使用的是空合并运算符可以使已经稍微更好。然而,为了应付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() ?? ""
使用扩展方法,它允许你打电话Elements
上IEnumerable<XElement>
......这样就(懒洋洋)一个groupBy
元素下评估每个property
元素的序列在Data
下,如果存在,则取其中的第一个,然后应用字符串转换。
答
你可以简单地在声明中添加额外的检查(干净的东西了使用空合并运算符位):
GroupByProperty = Data.Element("groupBy") != null ?
(Data.Element("groupBy").Element("property") ?? "") : "";
我觉得OP在说GROUPBY元素并未在XML存在。如果情况如此,这难道不会失败吗? – 2010-08-19 14:38:26
@Justin:是的,我误读 - 但现在修复:) – 2010-08-19 14:38:51
有趣。当你在调用链上游有一个空值时,我没有意识到你可以使用FirstOrDefault()。每天学些新东西。 – 2010-08-19 14:47:05