Далеко ходить не стал, решил заюзать веб-сервис от Google.
В итоге написал небольшую прогу на питоне, которая раз в 10 секунд получает текущую температуру, все просто и понятно..
from threading import Timer
from urllib2 import urlopen,quote,URLError
from xml.dom.minidom import parse
import sys
City = "Барнаул"
# Заменяем не ASCII символы на строки вида %xx, где xx - код в utf-8
qCity = quote(City)
uri = "http://www.google.co.uk/ig/api?weather=" + qCity
# Интервал опроса в секундах
interval = 10.0
timer = Timer(0.0,None)
def get_temperature():
try:
intstream = urlopen(uri)
except URLError, ex:
print "Ошибка при установке соединения."
sys.exit(0)
xmltree = parse(intstream)
# достаем текущие погодные условия
items = xmltree.getElementsByTagName("current_conditions");
cc_items = items[0].childNodes
temperature = -273
# достаем температуру
for cc_item in cc_items:
if(cc_item.nodeName=="temp_c"):
temperature = cc_item.attributes.getNamedItem("data").nodeValue
break
print temperature
def timer_proc():
global timer
get_temperature()
timer = Timer(interval,timer_proc)
timer.start()
def main():
global timer
timer = Timer(interval,timer_proc)
timer.start()
if __name__ == '__main__':
main()
Скачать код
Далее я переделал это консольное приложение в гуи под GTK. Скачать GTK-версию
Также написал то же самое на Java :) Скачать Java-версию
В итоге посмотрел реализации XML DOM-парсеров в этих языках. Увы в джаве не нашел какого-нибудь встроенного парсера, только голые интерфейсы.. Пришлось выкачивать реализацию от Apache Xerses.
В питоне есть встроенный minidom-парсер, который, имхо, замечательно подходит для такого типа задач..
PS:
У меня возникло несколько вопросов java-девелоперам:
- Есть ли, все-таки, встроенные парсеры?
- Можно ли внешнюю подключаемую библиотеку(jar) включать в итоговый исполняемый java-файл, причем не полностью, а только то, что необходимо? Ибо размер того же Xerses около 1,5 Мб.
Также привожу пример XML, выдаваемого гуглом на запрос погоды:
<?xml version="1.0"?>
<xml_api_reply version="1">
<weather module_id="0" tab_id="0">
<forecast_information>
<city data="город Барнаул, Region of Altai" />
<postal_code data="Барнаул" />
<latitude_e6 data="" />
<longitude_e6 data="" />
<forecast_date data="2008-01-02" />
<current_date_time data="2008-01-02 10:00:00 +0000" />
<unit_system data="SI" />
</forecast_information>
<current_conditions>
<condition data="Storm" />
<temp_f data="9" />
<temp_c data="-13" />
<humidity data="Humidity: 52%" />
<icon data="/images/weather/storm.gif" />
<wind_condition data="Wind: SW at 14 km/h" />
</current_conditions>
<forecast_conditions>
<day_of_week data="Today" />
<low data="-24" />
<high data="-12" />
<icon data="/images/weather/storm.gif" />
<condition data="Storm" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="Thu" />
<low data="-34" />
<high data="-16" />
<icon data="/images/weather/icy.gif" />
<condition data="Chance of Ice" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="Fri" />
<low data="-31" />
<high data="-26" />
<icon data="/images/weather/mostly_sunny.gif" />
<condition data="Mostly Sunny" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="Sat" />
<low data="-19" />
<high data="-17" />
<icon data="/images/weather/chance_of_snow.gif" />
<condition data="Chance of Snow" />
</forecast_conditions>
</weather>
</xml_api_reply>
Как видите, кроме текущих погодных условий, гугл выдает предсказания на будущее. Так что продолжение следует...