0

Python を使用して XML METAR (天気) データを読んでいます。データを読み取ることができ、エラー チェックも追加しました (以下の visibility_statute_mi のみ!)。XML データの例を次に示します。

<METAR>
  <raw_text>
  FALE 201800Z VRB01KT 9999 FEW016 BKN028 23/22 Q1010 NOSIG
  </raw_text>
  <station_id>FALE</station_id>
  <observation_time>2013-01-20T18:00:00Z</observation_time>
  <temp_c>23.0</temp_c>
  <dewpoint_c>22.0</dewpoint_c>
  <wind_dir_degrees>0</wind_dir_degrees>
  <wind_speed_kt>1</wind_speed_kt>
  <altim_in_hg>29.822834</altim_in_hg>
  <quality_control_flags>
  <no_signal>TRUE</no_signal>
  </quality_control_flags>
  <sky_condition sky_cover="FEW" cloud_base_ft_agl="1600"/>
  <sky_condition sky_cover="BKN" cloud_base_ft_agl="2800"/>
  <flight_category>MVFR</flight_category>
  <metar_type>METAR</metar_type>
</METAR>

データを解析するための Python 2.7 コードは次のとおりです。

# Output the XML in a HTML friendly manner
def outputHTML(xml):
    # The get the METAR Data list
    metar_data = xml.getElementsByTagName("data")

    # Our return string
    outputString = ""

    # Cycled through the metar_data
    for state in metar_data:

        #Gets the stations and cycle through them
        stations = state.getElementsByTagName("METAR")
        for station in stations:
            # Grab data from the station element
            raw_text                = station.getElementsByTagName("raw_text")[0].firstChild.data
            station_id              = station.getElementsByTagName("station_id")[0].firstChild.data
            observation_time        = station.getElementsByTagName('observation_time')[0].firstChild.data
            temp_c                  = station.getElementsByTagName('temp_c')[0].firstChild.data
            dewpoint_c              = station.getElementsByTagName('dewpoint_c')[0].firstChild.data
            wind_dir_degrees        = station.getElementsByTagName('wind_dir_degrees')[0].firstChild.data
            wind_speed_kt           = station.getElementsByTagName('wind_speed_kt')[0].firstChild.data
            visibility_statute_mi   = station.getElementsByTagName('visibility_statute_mi')
            if len(visibility_statute_mi) > 0:
              visibility_statute_mi = visibility_statute_mi[0].firstChild.data
            altim_in_hg             = station.getElementsByTagName('altim_in_hg')[0].firstChild.data
            metar_type              = station.getElementsByTagName('metar_type')[0].firstChild.data

            # Append the data onto the string
            string = "<tr><td>" + str(station_id) + "</td><td>" + str(observation_time) + "</td><td>" + str(raw_text) + "</td><td>" + str(temp_c) + "</td><td>" + str(dewpoint_c) + "</td></tr>"
            outputString+=string

    # Output string
    return outputString    

sky_condition データを読み取ってループし、sky_cover と cloud_base_ft_agl の値を取得するにはどうすればよいですか?

空の状態の値があるかどうかも確認する必要があります。雲量がなく、データがないことがよくあるためです。

アンドレ

4

1 に答える 1

3

xml を解析してツリーにし、クエリを実行します。たとえば、次のようにします。

import xml.etree.ElementTree as et

xmltext = """
<METAR>
  <raw_text>
  FALE 201800Z VRB01KT 9999 FEW016 BKN028 23/22 Q1010 NOSIG
  </raw_text>
  <station_id>FALE</station_id>
  <observation_time>2013-01-20T18:00:00Z</observation_time>
  <temp_c>23.0</temp_c>
  <dewpoint_c>22.0</dewpoint_c>
  <wind_dir_degrees>0</wind_dir_degrees>
  <wind_speed_kt>1</wind_speed_kt>
  <altim_in_hg>29.822834</altim_in_hg>
  <quality_control_flags>
  <no_signal>TRUE</no_signal>
  </quality_control_flags>
  <sky_condition sky_cover="FEW" cloud_base_ft_agl="1600"/>
  <sky_condition sky_cover="BKN" cloud_base_ft_agl="2800"/>
  <flight_category>MVFR</flight_category>
  <metar_type>METAR</metar_type>
</METAR>
"""
tree = et.fromstring(xmltext)

for sky_con in tree.iterfind('sky_condition'):
    print sky_con.attrib["cloud_base_ft_agl"]
    print sky_con.attrib.keys()

を読むことkeys()で、興味のある属性の存在を確認できます。

編集: 使用したい場合は、これらの行をステーションxml.dom.minidomに追加できます- ループして同じ属性を抽出します:

for sky_con in station.getElementsByTagName("sky_condition"):
    print sky_con._attrs["cloud_base_ft_agl"].value
    print sky_con._attrs["sky_cover"].value
于 2013-01-20T19:22:33.097 に答える