|
|
|
| Народ, кто-нибудь разобрался как парсить погодный xml с сайта gismeteo?
Тут была тема (http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=13533) на этот счет, но она как-то закончилась непонятно.
Если кто смог это сделать, может поделитесь? | |
|
|
|
|
|
|
|
для: denya
(15.12.2007 в 16:53)
| | стучи в асю в понедельник. Дам готовый скрипт. | |
|
|
|
|
|
|
|
для: denya
(15.12.2007 в 16:53)
| | могу быстрее. прямо завтра с утра :) правда погода только на сутки. а у Вас SHАman как? | |
|
|
|
|
|
|
|
для: afdm
(16.12.2007 в 00:21)
| | Тоже) В принципе, парсить xml - очень просто. Могу любую xml-ку распарсить за полчаса - максимум) И то, если лениться. Обычно это сводится к сочинению двух-трех регулярок, которые очень просты. Например, для RSS:
<item>
<title>Вызов ошибки 403</title>
<link>http://softtime.ru/forum/readrss.php?id=47149_1</link>
<description>Я еще делетан в PHP, и не раз для себя задавался проблемой вызова этой ошибки специально.
Вот собствено и все....</description>
<category>PHP</category>
<pubDate>Sun, 16 Dec 2007 00:59:04 +0300</pubDate>
<author>PAUELL</author>
</item>
|
Если мне нжна тема и ссылка, то будет две регулярки и один цикл.
<title>(.*?)<\/title> и <link>(.*?)</link>
по-моему, проще некуда. Если нужно распарсить то, что вытянул из тегов, то еще одна регулярочка. А то и без нее. Вообще, это все можно посмотреть в любом самоучителе в разделе захвата и кластеризации. | |
|
|
|
|
|
|
|
для: SHAman
(16.12.2007 в 01:48)
| | Эх... все равно делать нечего) Давайте подумоем)
дано:
<FORECAST day="16" month="12" year="2007" hour="8" tod="1" predict="18" weekday="1">
<PHENOMENA cloudiness="0" precipitation="10" rpower="0" spower="0" />
<PRESSURE max="754" min="752" />
<TEMPERATURE max="-2" min="-4" />
<WIND min="3" max="6" direction="0" />
<RELWET max="86" min="81" />
<HEAT min="-4" max="-2" />
</FORECAST>
|
Сначала, нужно, как я понимаю, разфигачить это на куски. предлагаю сделать это сплитом по '<FOREACAST'.
Дальше вытягиваем параметры (показываю один раз, потом - по образу и подобию) из FORECAST. Так как самого форекаста у нас нет, то продолжаем без головы
/day=(['"]?)(.*?)\$1.*?month=\$1(.*?)\$1.*?year=\$1(.*?)\$1 ну и так далее.*?>/i
| В и тоге получаем массив значений: в нулевом элементе, вся строка, в первом - кавычка, либо пустота, дальше - день, дальше - месяц, дальше - год и т.д.
Например, парсим температуру:
/<TEMPERATURE max=(['"]?)(.*?)\$1 min=\$1(.*?)\$1.*?>/i
| теперь на выходе опять будет:
0 - вся строка, 1 - кавычка, 2 - максимальная температура, 3 - минимальная.
Зачем я ловлю кавычку? Просто! Вместо (['"]?) мы можем написать просто ", но если мастерам придет в голову изменить шаблон и они поставят там не двойную, а одинарную кавычку, наша регулярка перестанет работать. Правда, мы теряем в скорости и памяти, но не много. Мы ловим кавычку и подставляем ее туда, где они стоят. Если не нравится, можно ставить просто " и не париться.
Надеюсь, понятно объяснил... Надо будет статью написать на эту тему... | |
|
|
|
|
|
|
|
для: SHAman
(16.12.2007 в 01:48)
| | Ну мне с Вами, SHAman рановато пока тягаться по рег. выражениям (читаю ваш блог регулярно в т.ч. и по регулярным выражениям :)
да просто у меня готовый класс (тут недавно тема была) есть для этого дела :) поэтому для меня это дело двух секунд :))) | |
|
|
|
|
|
|
|
для: afdm
(16.12.2007 в 02:08)
| | Приятно встретить читателя) Я не гуру регулярок, если честно. Но пока не встречался с задачами, которые не мог бы решить. Если подкинешь - буду благодарен ;) | |
|
|
|
|
 163.5 Кб |
|
|
для: denya
(15.12.2007 в 16:53)
| | как и обещал...
Вот собственно. Хотя SHAman вроде бы уже всё разжевал :))) | |
|
|
|
|
|
|
|
для: afdm
(16.12.2007 в 12:20)
| | А как его подключать?
Блин, нИпонятно!
P.S. SHAman...а ты статейку то напиши | |
|
|
|
|
|
|
|
для: denya
(16.12.2007 в 19:58)
| | Создаем объект, вызываем метод query и все. Там же все навписано в самом классе! | |
|
|
|
|
|
|
|
для: SHAman
(16.12.2007 в 22:32)
| | То есть я создаю файл «Weather.class.php», в него запихиваю всё от class Weather до последней скобки.
Потом создаю какой-нибудь файл weather.php, в него пишу
require_once('Weather.class.php');
$wthr = new Weather();
$wthr->query('москва');
|
И всё?
Если так, то у меня ругается:
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in Weather.class.php on line 8
Лайн 8 это
protected $towns = array(
|
Вам, программистам просто говорить: берёшь, создаёшь, вставляешь.
А если я не знаю синтаксиса...ну не всем быть программистами. | |
|
|
|
|
|
|
|
для: denya
(15.12.2007 в 16:53)
| | Можно остюда отолкнуться.... удали, что не нужно...
<?PHP
header("Content-type: text/html; charset=UTF-8");
?>
<html>
<head>
<title>Погода</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="./">Код города:
<input type="text" name="id" value="<?=htmlspecialchars(@$_GET['id'])?>"/>
<select name="tod" selected="">
<option value=" " > </option>
<option value="0"<?= @$_GET['tod']==0?'selected':''?>>утро</option>
<option value="1"<?= @$_GET['tod']==1?'selected':''?>>день</option>
<option value="2"<?= @$_GET['tod']==2?'selected':''?>>вечер</option>
<option value="3"<?= @$_GET['tod']==3?'selected':''?>>ночь</option>
</select>
<input type="submit" value="Смотреть" />
</form>
<hr />
<?
if(!empty($_GET['id']))
{INFO_pogoda($_GET['id'],$_GET['tod']);}
?>
</body>
</html>
<?
function INFO_pogoda($A,$B)
{
$sxml = simplexml_load_file('http://informer.gismeteo.ru/xml/'.$A.'.xml');
$TOWN = $sxml->REPORT->TOWN->attributes();
echo '<b>Информация о пункте прогнозирования:</b><br />';
echo 'ID: '.$TOWN->index.'<br />';
echo 'Город: '.iconv('windows-1251','UTF-8',urldecode($TOWN->sname)).'<br />';
echo 'Широта: '.$TOWN->latitude.'<br />';
echo 'Долгота: '.$TOWN->longitude.'<br />';
echo '<hr />';
if($B>=0 && $B<4)
{
$FORECAST = $sxml->REPORT->TOWN->FORECAST;
INFO_tod($FORECAST[(int)$B]);
}
else
{
foreach($sxml->REPORT->TOWN->FORECAST as $FORECAST)
{INFO_tod($FORECAST);}
}
}
function INFO_tod($FORECAST)
{
$INFO = $FORECAST->attributes();
echo '<b>Информация о сроке прогнозирования:</b><br />';
echo 'Дата: '.$INFO->day.'-'.$INFO->month.'-'.$INFO->year.'<br />';
$NAME_tod = array('ночь','утро','день','вечер');
echo 'Время суток: '.$NAME_tod[(int)$INFO->tod].'<br />';
$NAME_weekday = array(0,'воскресенье','понедельник','вторник','среда','четверг','пятница','суббота');
echo 'День недели: '.$NAME_weekday[(int)$INFO->weekday].'<br />';
echo 'Местное время: '.$INFO->hour.'<br />';
echo 'заблаговременность прогноза в часах: '.$INFO->predict.'<br />';
echo '<br />';
$PHENOMENA = $FORECAST->PHENOMENA->attributes();
echo '<b>Атмосферные явления:</b><br />';
$NAME_c_p = array('ясно','малооблачно','облачно','пасмурно','дождь','ливень',0,'снег','гроза','нет данных','без осадков');
$NAME_rpower = array('возможен дождь/снег','дождь/снег');
$NAME_spower = array('возможна гроза','гроза');
echo 'облачность по градациям: '.$NAME_c_p[(int)$PHENOMENA->cloudiness].'<br />';
echo 'тип осадков: '.$NAME_c_p[(int)$PHENOMENA->precipitation].'<br />';
echo 'интенсивность осадков: '.$NAME_rpower[(int)$PHENOMENA->rpower].'<br />';
echo 'вероятность грозы: '.$NAME_spower[(int)$PHENOMENA->spower].'<br />';
echo '<br />';
$PRESSURE = $FORECAST->PRESSURE->attributes();
echo '<b>Атмосферное давление, в мм.рт.ст.:</b><br />';
echo 'макс: '.$PRESSURE->max.'<br />';
echo 'мин: '.$PRESSURE->min.'<br />';
echo '<br />';
$TEMPERATURE = $FORECAST->TEMPERATURE->attributes();
echo '<b>Температура воздуха, в градусах Цельсия:</b><br />';
echo 'макс: '.$TEMPERATURE->max.'<br />';
echo 'мин: '.$TEMPERATURE->min.'<br />';
echo '<br />';
$WIND = $FORECAST->WIND->attributes();
echo '<b>Приземный ветер:</b><br />';
echo 'макс: '.$WIND->max.'<br />';
echo 'мин: '.$WIND->min.'<br />';
$NAME_direction = array('северный','северо-восточный','восточный','юго-восточный','южный','юго-западный','западный','северо-западный');
echo 'направление ветра в румбах: '.$NAME_direction[(int)$WIND->direction].'<br />';
echo '<br />';
$RELWET = $FORECAST->RELWET->attributes();
echo '<b>Относительная влажность воздуха, в %:</b><br />';
echo 'макс: '.$RELWET->max.'<br />';
echo 'мин: '.$RELWET->min.'<br />';
echo '<br />';
$HEAT = $FORECAST->HEAT->attributes();
echo '<b>Комфорт - температура воздуха по ощущению одетого по сезону человека, выходящего на улицу:</b><br />';
echo 'макс: '.$HEAT->max.'<br />';
echo 'мин: '.$HEAT->min.'<br />';
echo '<hr />';
}
?>
|
| |
|
|
|
|
|
|
|
для: а-я
(04.01.2008 в 03:31)
| | да кстати, загляни в блог Шамана dayte2.com кажется... он статейку-то написал по этому поводу... | |
|
|
|
|
|
|
|
для: afdm
(04.01.2008 в 10:51)
| | Написал. Только там я RSS парсю. XML торжественно обещал распарсить, но только никак руки не дойдут. | |
|
|
|