我有以下xml文件(缩短)。正如你所看到的,我想得到第二个" maxtempC"值。
<data>
<request>...</request>
<current_condition>...</current_condition>
<weather>
<date>2015-06-12</date>
<astronomy>...</astronomy>
<maxtempC>27</maxtempC>
<maxtempF>80</maxtempF>
<mintempC>14</mintempC>
<mintempF>58</mintempF>
<uvIndex>7</uvIndex>
<hourly>...</hourly>
<hourly>...</hourly>
<hourly>...</hourly>
<hourly>...</hourly>
</weather>
<weather>
<date>2015-06-13</date>
<astronomy>...</astronomy>
<maxtempC>25</maxtempC> //I want this Value
<maxtempF>77</maxtempF>
<mintempC>14</mintempC>
<mintempF>56</mintempF>
<uvIndex>6</uvIndex>
<hourly>...</hourly>
<hourly>...</hourly>
<hourly>...</hourly>
<hourly>...</hourly>
</weather>
</data>
我已尝试使用以下内容:
XElement wData = XElement.Load(query);
string maxtempC2;
act_maxtempC2 = wData.Elements("weather")
.Skip(1)
.Take(1)
.Elements("maxtempC")
.Value;
我也尝试过使用它:
act_maxtempC2 = wData.Elements("weather")
.Skip(1)
.Take(1)
.Elements("maxtempC")
.Select(o => o.Value);
但是在这两种情况下,它都没有给出Node的值,只是这样一个奇怪的字符串:{System.Linq.Enumerable.WhereSelectEnumerableIterator}
我希望你能帮助我
答案 0 :(得分:0)
为什么不
act_maxtempC2 = wData.Elements("data").ToList()[1].Element("weather").Element("maxtempC");
你选择&#34; s&#34;超出元素
答案 1 :(得分:0)
这应该做的工作:
var value = wData.Elements("weather").Skip(1).Elements("maxtempC").Select(e => e.Value).FirstOrDefault();
这句话的问题:
var act_maxtempC2 = wData.Elements("weather")
.Skip(1)
.Take(1)
.Elements("maxtempC")
.Select(o => o.Value);
您是否从未真正评估过linq查询。您需要添加FirstOrDefault()
来实际检索字符串值:
var act_maxtempC2 = wData.Elements("weather")
.Skip(1)
.Take(1)
.Elements("maxtempC")
.Select(o => o.Value)
.FirstOrDefault();
为了澄清,Enumerable.Take(1)
没有将可枚举项目投射到其第一个元素中。相反,它返回一个包含输入可枚举的第一个元素的过滤的可枚举。要投射到特定元素,请使用FirstOrDefault()
例如; ElementAt()
是另一种选择。