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