Работа с web-службами в JAVA на примере получения прогноза погоды.

Недавно пришла в голову идея прикрутить к моему Jabber-боту возможность отправлять пользователю прогноз погоды. Первым делом полез на ГисМетео, но, к сожалению, не нашел там ничего подходящего. Поискав еще немного, нашел неплохой украинский сервис http://www.weather.co.ua, умеющий отдавать данные в XML. Именно это мне и надо было. Для работы с XML решил воспользоваться библиотекой JDOM, поскольку она уже была подключена к моему боту и использовалась вместе с Rome для разбора RSS-лент.

Итак, вот как работает эта система:

По адресу http://xml.weather.co.ua/1.2/city/?country=643 имеем список всех городов России (для другой страны необходимо изменить параметр country). Вот пример того, как описывается Москва:

<city id="27">
<name>Москва</name>
<name_en>Moscow</name_en>
<region>
<country>Россия</country>
<country_id>643</country_id>
</region></city>

Нам необходимо получить ID города и сделать запрос вида http://xml.weather.co.ua/1.2/forecast/ид_города. Делаем это так:

//Парсим XML с городами
SAXBuilder parser = new SAXBuilder();  
Document xmlDoc; 
xmlDoc = parser.build(new URL(&quot;http://xml.weather.co.ua/1.2/city/?country=643&quot;));  
// Получаем список всех городов
List elements = xmlDoc.getRootElement().getContent(new ElementFilter(&quot;city&quot;));        
//Получаем имена городов
Iterator iterator = elements.iterator();
while(iterator.hasNext())
{
            Element city = (Element)iterator.next();  
            String id = city.getAttributeValue(&quot;id&quot;);             
            String name = city.getChildText(&quot;name&quot;);
            //usrCity - город, полученный от пользователя
            if(name.toUpperCase().indexOf(usrCity.toUpperCase())&gt;=0)
            {
	       	System.out.println(&quot;Найден город: &quot; + name + &quot;\nID: &quot; + id);
	       	System.out.println(&quot;Идем за погодой на http://xml.weather.co.ua/1.2/forecast/&quot; + id);
	       	//Получаем XML с погодой.
                xmlDoc = parser.build(new URL(&quot;http://xml.weather.co.ua/1.2/forecast/&quot; + id));
	       	elements = xmlDoc.getRootElement().getContent(new ElementFilter(&quot;forecast&quot;));
	        //Прогноз указан по дням. Обойдем их в цикле
                iterator = elements.iterator();  
	    	while(iterator.hasNext())
	    	{
	    	     	Element forecast = (Element)iterator.next();  
	    	       	List mixedCo = forecast.getChildren(&quot;day&quot;);
	    	       	Iterator itr = mixedCo.iterator();
	    	       	while (itr.hasNext())
                        {
	    	     	    Element day = (Element)itr.next(); 
	    	            //Узнаем дату
                            String StrDate = day.getAttributeValue(&quot;date&quot;);
		    	    //и час прогноза
                            String hour = day.getAttributeValue(&quot;hour&quot;);
		    	    //Переведем их в более удобный формат
                            SimpleDateFormat formatter = new SimpleDateFormat(&quot;yyyy-MM-dd&quot;);
		    	    Date date = formatter.parse(StrDate);
		    	    SimpleDateFormat formatter2 = new SimpleDateFormat(&quot;E dd.MM.yyyy &quot;);
		    	    String dt2=formatter2.format(date);
		    	    System.out.println(&quot;Прогноз на: &quot; + dt2 + &quot;, &quot; + hour + &quot; часов&quot;);
		    	    //Температура
                            Element temperature = day.getChild(&quot;t&quot;);
		    	    String max_temp = temperature.getChildText(&quot;max&quot;);
		    	    String min_temp = temperature.getChildText(&quot;min&quot;);
		    	    System.out.println(&quot;Температура: \nМаксимум: &quot; + max_temp + &quot;\nМинимум: &quot; + min_temp);
		    	 }
	    	}  	        	
            System.out.println(&quot;Сходили!&quot;);
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *