По просьбам трудящихся

В комментариях к прошлому посту люди попросили выложить тот более «простой» вариант парсера, где можно воспользоваться обработчиками xml вместо регулярных выражений. Мне не спалось и я решил накидать этот вариант…

Вот собственно он:

<?
//Выводим на экран сообщение
echo "<strong>Погода в Санкт-Петербурге</strong> <hr/></br>";
//Получаем содержимое
$content = file_get_contents('http://informer.gismeteo.ru/xml/27612_1.xml');
//Интерпретируем строку с XML в объект
$xml = simplexml_load_string($content);
//цикл для каждого прогноза
foreach ($xml -> REPORT -> TOWN -> FORECAST as $forecast) {
$day = $forecast -> attributes() -> day;//день
$month = $forecast -> attributes() -> month;//месяц
$year = $forecast -> attributes() -> year;//год
switch ($forecast -> attributes() -> hour) //время суток
{
case 3:
$daytime = 'ночь';
break;
case 9:
$daytime = 'утро';
break;
case 15:
$daytime = 'день';
break;
case 21:
$daytime = 'вечер';
break;
default:
$daytime = '';
break;
}
switch($forecast -> attributes() -> weekday) //день недели
{
case 1:
$weekday = 'Воскресение';
break;
case 2:
$weekday = 'Понедельник';
break;
case 3:
$weekday = 'Вторник';
break;
case 4:
$weekday = 'Среда';
break;
case 5:
$weekday = 'Четверг';
break;
case 6:
$weekday = 'Пятница';
break;
case 7:
$weekday = 'Суббота';
break;
default:
$weekday = '';
break;
}
switch($forecast -> PHENOMENA -> attributes() -> cloudiness) //облачность
{
case 0:
$cloudiness = 'ясно';
break;
case 1:
$cloudiness = 'малооблачно';
break;
case 2:
$cloudiness = 'облачно';
break;
case 3:
$cloudiness = 'пасмурно';
break;
default:
$cloudiness = '';
break;
}
switch($forecast -> PHENOMENA -> attributes() -> precipitation) //осадки
{
case 4:
$precipitation = 'дождь';
break;
case 5:
$precipitation = 'ливень';
break;
case 6:
$precipitation = 'снег';
break;
case 7:
$precipitation = 'снег';
break;
case 8:
$precipitation = 'гроза';
break;
case 9:
$precipitation = 'нет данных';
break;
case 10:
$precipitation = 'без осадков';
break;
default:
$precipitation = '';
break;
}
//давление
$pressuremax = $forecast -> PRESSURE -> attributes() -> max;
$pressuremin = $forecast -> PRESSURE -> attributes() -> min;
//температура
$tempmax = $forecast -> TEMPERATURE -> attributes() -> max;
$tempmin = $forecast -> TEMPERATURE -> attributes() -> min;
//ветер
$windmax = $forecast -> WIND -> attributes() -> max;
$windmin = $forecast -> WIND -> attributes() -> min;
//влажность
$relwetmax = $forecast -> RELWET -> attributes() -> max;
$relwetmin = $forecast -> RELWET -> attributes() -> min;

print "<strong>Дата:</strong> $day.$month.$year, $weekday.  <strong>Время суток:</strong> $daytime. </br>";
print "<strong>Облачность:</strong> $cloudiness.  <strong>Осадки:</strong> $precipitation. </br>";
print "<strong>Давление:</strong> $pressuremax..$pressuremin мм.рт.ст. </br>";
print "<strong>Температура:</strong> $tempmax°..$tempmin°C. </br>";
print "<strong>Ветер:</strong> $windmin..$windmax м/с. </br>";
print "<strong>Влажность воздуха:</strong> $relwetmax%..$relwetmin%. </br>";
print "<hr/>";
}
?>

Как мы видим код напоминает прошлый, да и результат работы скрипта абсолютно такой же. Теперь необходимо разобраться.

Самое интересное начинается здесь:

$xml = simplexml_load_string($content);

Функция simplexml_load_string() интерпретирует строку с XML в объект. Т.е. она берет «правильный» XML-документ, находящийся в строке content и возвращает объект класса SimpleXMLElement, имеющий свойства, равные содержимому xml-документа. Если XML-документ имеет ошибки, функция возвратит FALSE. В результате чего можно напрямую обращаться к элементам и атрибутам xml-документа.

Достаточно посмотреть на наш XML-документ и можно увидеть что элементы являются вложенными, т.е. xml имеет иерархическую структуру. Так у нас например в REPORT вложен TOWN, а в него – FORECAST и так далее. Соответственно запись

foreach ($xml -> REPORT -> TOWN -> FORECAST as $forecast)

должна быть понятна. $forecast в свою очередь наследует все свойства объекта и далее мы можем работать с ним для прогноза на какое-либо время суток. Соответственно как мы получаем атрибуты тоже становится понятным:

$day = $forecast -> attributes() -> day;

Далее уже описанные в прошлом посте операторы выбора (switch), ну и конечно же print(), почти такие же как и в прошлом скрипте.

Как мне кажется такое извлечение данных с помощью обработчиков xml намного проще, т.к. все данные у нас «как на блюдичке» и доступ к ним очень прост.

Вариант с регулярными выражениями больше подходит для получения информации из HTML.

Пожалуй на этом все, теперь пойду спать))