0

free.worldweatheronline.comのxmlWebサービスからデータを取得しようとしています。最初に、都市の名前を指定します。都市がWebサービスで見つかった場合、次のようなデータが返されます。

<data><request><type>City</type><query>Hyderabad, india</query></request><current_condition><observation_time>06:04 AM</observation_time><temp_C>34</temp_C><temp_F>92</temp_F><weatherCode>113</weatherCode><weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png</weatherIconUrl><weatherDesc>Sunny</weatherDesc><windspeedMiles>14</windspeedMiles><windspeedKmph>22</windspeedKmph><winddirDegree>230</winddirDegree><winddir16Point>SW</winddir16Point><precipMM>0.0</precipMM><humidity>50</humidity><visibility>10</visibility><pressure>1011</pressure><cloudcover>0</cloudcover></current_condition>

httpサービスのフレックスコードは次のようになります。

<s:HTTPService id="weatherService"
                   url="{BASE_URL}"
                   resultFormat="object"
                   result="weatherService_resultHandler(event)"
                   fault="weatherService_faultHandler(event)"
                   showBusyCursor="true">
        <s:request xmlns="">
            <q>{cityName.text.toString()}</q>
            <format>{FORMAT}</format>
            <num_of_days>{NUMBER_OF_DAYS}</num_of_days>
            <key>{API_KEY}</key>
        </s:request>
    </s:HTTPService>

これはコードを処理しています:

private static const BASE_URL:String="http://free.worldweatheronline.com/feed/weather.ashx";
private static const API_KEY:String="MY_API_KEY";
private static const NUMBER_OF_DAYS:uint=2;
private static const FORMAT:String="xml";


protected function weatherService_resultHandler(event:ResultEvent):void
{
    // TODO Auto-generated method stub
    var result_weather_data:Object = event.result;
    cityNameData.text=result_weather_data.data.request.query;
}

protected function weatherService_faultHandler(event:FaultEvent):void
{
    // TODO Auto-generated method stub          

}

都市が見つからない場合は、次のようなxmlデータを返します。

<data><error><msg>Unable to find any matching weather location to the query submitted!</msg></error></data>

私はこのようにしようとしています

var error_msg:String = result_weather_data.data.error.msg; 

上記のコードのcityNameData.textの前にありますが、その未定義のプロパティなどのエラーが発生します

4

1 に答える 1

0

プロパティがxmlに存在しない場合、エラーがスローされます

// また、この子ノードにアクセスするためにルート名を指定する必要がないことに注意してください

//このように XML でそのプロパティが使用可能かどうかを確認する必要があります

        if(event.result is XML)
    {           
        var errorXML:XML = event.result as XML; 

        if(errorXML && errorXML.hasOwnPerperty("error") )
        {
            if(errorXML.error && errorXML.error.hasOwnProperty("msg"))
            {
                var yourErrorMsg:String = errorXML.error.msg; 
            }
        }
    }           
    else if(event.result is Object)
    {
        var result_weather_data:Object = event.result;

        if(result_weather_data && result_weather_data.hasOwnProperty('data'))
        {
            if(result_weather_data.data && result_weather_data.data.hasOwnProperty("request"))
            {
                if(result_weather_data.data.request && result_weather_data.data.request.hasOwnProperty("query"))
                {
                    cityNameData.text = result_weather_data.data.request.query;
                }
                else
                {
                    trace("query property not exists in result_weather_data.data.request Object");
                }
            }
            else
            {
                trace("request property not exists in result_weather_data.data Object");
            }
        }
        else
        {
            trace("result_weather_data is NULL or data property not exists in result_weather_data Object");
        }
    }
于 2012-09-26T08:06:08.053 に答える