Чтение элементов XML и дочерних узлов с помощью LINQ в Vb.net - помогите мне в условии где :( - PullRequest
0 голосов
/ 26 августа 2009

Мне нужна помощь в чтении элементов xml с использованием LINQ с определенным условием где.

Мне нужно найти максимум air_temp для округа то есть где название округа = "Бун" и час ID = "06/03/2009 09: 00CDT"

Я попробовал что-то вроде ниже, но не повезло:

 Dim custs As IEnumerable = From c In Element.Load("C:\meridian.xml").Elements("county") _
                            Select c.Elements("hour").Elements("air_temp").Max()

 For Each x In custs
        Response.Write(custs(0).ToString())
 Next

------------------- вот файл xml:

 <forecasts>
      <issued>06/02/2009 12:00CDT</issued> 
    - <county name="Adair">
    - <hour id="06/02/2009 12:00CDT">
          <air_temp>61</air_temp> 
          <cloud_cover>overcast</cloud_cover> 
          <dew_point>59</dew_point> 
          <precip_prob>90</precip_prob> 
          <precip_rate>0.12</precip_rate> 
          <precip_type>rain</precip_type> 
          <snow_rate>0.0</snow_rate> 
          <wind_direction>NE</wind_direction> 
          <wind_speed>12</wind_speed> 
          <dew_point_confidence>-3/+3</dew_point_confidence> 
          <road_temp>64</road_temp> 
          <road_frost_prob>0</road_frost_prob> 
          <road_potential_evap_rate>429</road_potential_evap_rate> 
          <road_temp_confidence>-3/+2</road_temp_confidence> 
          <dew_point_confidence>-3/+3</dew_point_confidence> 
          <bridge_temp>63</bridge_temp> 
          <bridge_temp_confidence>-4/+2</bridge_temp_confidence> 
          <bridge_frost>NO</bridge_frost> 
      </hour>
    - <hour id="06/02/2009 13:00CDT">
          <air_temp>61</air_temp> 
          <cloud_cover>overcast</cloud_cover> 
          <dew_point>60</dew_point> 
          <precip_prob>70</precip_prob> 
          <precip_rate>0.01</precip_rate> 
          <precip_type>rain</precip_type> 
          <snow_rate>0.0</snow_rate> 
          <wind_direction>ENE</wind_direction> 
          <wind_speed>10</wind_speed> 
          <dew_point_confidence>-3/+3</dew_point_confidence> 
          <road_temp>65</road_temp> 
          <road_frost_prob>0</road_frost_prob> 
          <road_potential_evap_rate>411</road_potential_evap_rate> 
          <road_temp_confidence>-3/+2</road_temp_confidence> 
          <dew_point_confidence>-3/+3</dew_point_confidence> 
          <bridge_temp>64</bridge_temp> 
          <bridge_temp_confidence>-4/+1</bridge_temp_confidence> 
          <bridge_frost>NO</bridge_frost> 
      </hour>

Ответы [ 3 ]

2 голосов
/ 26 августа 2009
Dim document = XDocument.Load("meridian.xml")
Dim air_temps = From county In document.Root.Elements("county") _
                From hour in county.Elements("hour") _
                From air_temp in hour.Elements("air_temp") _
                Select CInt(air_temp)
Dim max_air_temp = air_temps.Max()

Использование литералов XML:

Dim forecasts = XElement.Load("meridian.xml")
Dim air_temps = From air_temp In forecasts.<county>.<hour>.<air_temp> _
                Select CInt(air_temp)
Dim max_air_temp = air_temps.Max()
1 голос
/ 27 августа 2009

Не должно ли быть

From hour In county.Elements("hour") Where hour.Attribute("id")...

вместо

From hour In county.Elements("hour") Where county.Element("hour").Attribute("id")...

Кроме того, вы не должны публиковать ответы на другие сообщения в качестве дополнительных ответов.

1 голос
/ 26 августа 2009

Я предполагаю, что вам нужны агрегаты "страна / макс. Дата / макс. Значение" в качестве выходных данных. Если это так, то сработает:

Dim meridian = XDocument.Load("meridian.xml")
Dim maxByCounty = _
    From county In meridian.<forecasts>.<county> _
    Let maxHour = (From hour In county.<hour> _
                   Order By CType(hour.<air_temp>, Integer) Desescending _
                  ).First _
    Select New With { .Name = county.<name>, _
                      .Hour = maxHour.@id, 
                      .AirTemp = maxHour.<air_temp> }

И тогда вы можете использовать результат следующим образом:

For Each m In maxByCounty
    Console.WriteLine(m.Name, m.Hour, m.AirTemp)
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...