我正在读取XML文件并使用其中的数据创建新对象,然后使用LINQ设置读取数据的对象属性。
例如,XML的一部分如下所示:
<heat_index_string>NA</heat_index_string>
<heat_index_f>NA</heat_index_f>
<heat_index_c>NA</heat_index_c>
<windchill_string>NA</windchill_string>
<windchill_f>NA</windchill_f>
<windchill_c>NA</windchill_c>
<pressure_mb>1013</pressure_mb>
<pressure_in>29.92</pressure_in>
通常这些“NA”将由double
表示(E.G:public double HeatIndexC { get; set; }
)但是,如果该数据无法从服务获得,则服务返回“NA”。 XML中的其他地方没有其他信息可以提供可用或不可用的数据列表。
我读了这样的XML:
var data = from i in weather.Descendants("current_observation")
select new CurrentConditions
{
HeatIndexC = (double)i.Element("heat_index_c"),
//Set other properties here
};
可以看出,只要服务返回一个double,但只要它返回一个字符串就会产生异常,这样就可以正常工作。
那么,我该怎么做呢?我的第一个想法是为每个部分创建更多属性,如下所示:
public bool TemperatureAvaliable { get; set; };
我的另一个想法是只使用字符串类型,但这看起来非常灵活,根本不是惯用语。
要明确:我不知道如何处理有时会返回双倍但有时会返回字符串的服务。此外,该服务不会说明何时返回字符串或双精度数。
答案 0 :(得分:1)
使用TryParse
。
如果heatIndex没有解析,我假设默认值为0。使用可空双精度可能是更合适的选择。
double heatIndexC;
var data = from i in weather.Descendants("current_observation")
select new CurrentConditions
{
var HeatIndexC = double.TryParse(i.Element("heat_index_c")
.Value, out heatIndexC)
? heatIndexC : 0,
//Set other properties here
};
编辑:修正了值的输出。
答案 1 :(得分:1)
我会使用Nullable<double>
(a.k.a。double?
)。然后问题是:你如何转换&#34; NA&#34;到double?
?这是一种方法:
var data = from i in weather.Descendants("current_observation")
select new CurrentConditions
{
HeatIndexC = ToNullableDouble(i.Element("heat_index_c")),
//Set other properties here
};
double? ToNullableDouble(object xml)
{
if (xml == null)
return null;
if (xml is double)
return (double?)xml;
double value;
return double.TryParse(xml.ToString(), out value) ? value : (double?)null;
}
您可能还想明确查看&#34; NA&#34;如果出现任何无法识别的字符串,则抛出异常,而不是静默删除意外数据。
修改
我刚注意到XElement还定义了这个转换运算符,这可能是处理这个问题的更好方法:
var data = from i in weather.Descendants("current_observation")
select new CurrentConditions
{
HeatIndexC = (double?)i.Element("heat_index_c"),
//Set other properties here
};