选择具有相同名称的节点并读取其中一个子节点的值

时间:2015-06-11 21:04:57

标签: c# xml linq

我有以下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}

我希望你能帮助我

2 个答案:

答案 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()是另一种选择。