Помогите с парсером погоды

VandJ

Постоялец
Регистрация
8 Апр 2008
Сообщения
326
Реакции
129
Добрый день
Хочу сделать парсер погоды с wether.co.ua
С сервера передается следующий код
Код:
<forecast version="1.2" last_updated="Thu, 12 Mar 2009 19:06:53 +0200">	
	<forecast> 
		<day date="2009-03-12" hour="21"> 
			<cloud>30</cloud> 
			<pict>_3_pasmurno.gif</pict> 
			<ppcp>45</ppcp> 
			<t> 
				<min>4</min> 
				<max>6</max> 
			</t> 
			<p> 
				<min>759</min> 
				<max>762</max> 
			</p> 
			<wind> 
				<min>2</min> 
				<max>4</max> 
				<rumb>134</rumb> 
			</wind> 
			<hmid> 
				<min>73</min> 
				<max>79</max> 
			</hmid> 
			<wpi>85</wpi> 
		</day> 
	</forecast> 
</forecast>

В программировании не силен, вернее мои знания стремятся к нулю:ah:.
Немного погуглил и нашел вот такую ссылочку:
.
Сделал по аналогии следующее:
Код:
<?php
$day = array();        // В этом массиве будут храниться новости,
                        // полученные из XML файла
$currentDay = null;    // Текущая новость. Используется в процессе
                        // импорта данных
$index = null;          // Текущий индекс в массиве новостей.
                        // Используется в процессе импорта данных

// Функции, описанные ниже, являются обработчиками различных типов
// XML-данных и будут вызываться парсером в процессе разбора.

// Функция для обработки начальных тегов XML
// На входе:
//   - указатель на SAX парсер
//   - имя XML тега
//   - массив аттрибутов
function saxStartElement($parser,$name,$attrs)
{
    global $currentDay,$index;

    switch($name)
    {
        case 'forecast':
// Тег newsLine содержит все новости. Мы должны подготовить
// массив $news для приема новостей из XML файла.
            $news = array();
            break;
            case 'day':
// Каждая новость находится в теге news. Подготавливаем массив
// $currentNews для приема этой новости
            $currentNews = array();
// Если у новости есть дата - сохраняем ее в массиве
            if (in_array('date',array_keys($attrs)))
                $currentDay['date'] = $attrs['date'];
           	if (in_array('hour',array_keys($attrs)))
                $currentDay['hour'] = $attrs['hour'];
            break;
        default:

// Все остальные теги, которые могут встретиться в XML файле
// находятся внутри тега <news>, поэтому мы просто запоминаем
// их название с тем, чтобы знать, какие именно данные мы
// обрабатываем.
            $index = $name;
            break;
    };
}

// Функция для обработки конечных тегов XML
// На входе:
//   - указатель на SAX парсер
//   - имя XML тега
function saxEndElement($parser,$name)
{
    global $day,$currentDay,$index;

    if ((is_array($currentDay)) && ($name=='day'))
// Если в данный момент у нас есть массив $currentNews (т.е.
// мы обрабатываем содержимое новости) и имя закрывающего
// тега - "news", то это значит, что данные для этой новости
// кончились и мы можем поместить готовую новость в массив
// новостей.
    {
        $day[] = $currentDay;
// Уничтожаем массив текущей новости, чтобы показать, что
// в данный момент мы не занимаемся получением данных для
// новости.
        $currentDay = null;
    };
// В любом случае закрытие тега означает, что символьные
// данные, получаемые парсером не нужно помещать куда-либо.
    $index = null;
}

// Функция для обработки символьных данных
// На входе:
//   - указатель на SAX парсер
//   - символьные данные XML
function saxCharacterData($parser,$data)
{
    global $currentDay,$index;

// Мы принимаем только данные для новостей, помещенные в
// какой-нибудь тег. Все остальные символьные данные
// (как правило это пустое пространство, использованное
// для форматирования) мы опускаем за ненадобностью.
    if ((is_array($currentDay)) && ($index))
        $currentDay[$index] = $data;
}

// Создаем SAX парсер, который будет использоваться для
// обработки XML-данных.
$parser = xml_parser_create();
// Регистрируем функции для обработки различных типов
// XML-данных:
//  - начальный и конечный тэги XML
xml_set_element_handler($parser,'saxStartElement','saxEndElement');
//  - символьные данные
xml_set_character_data_handler($parser,'saxCharacterData');
// Также существуют аналогичные функции для регистрации
// обработчиков других типов XML-данных.
// Убираем case folding, в этом случае имена тэгов будут
// передаваться обработчикам в оригинальном виде. Если case
// folding включен, то все имена тегов будут переведены
// в верхний регистр.
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,false);
// Получаем содержимое XML-файла с новостями.
$xml = join('',file('http://xml.weather.co.ua/1.2/forecast/72?dayf=5&lang=ru'));
// Производим парсинг (разбор) полученного XML-файла.
// В процессе разбора парсер будет вызывать описанные нами
// функции и в результате мы получим массив $news,
// содержащий новости из XML-файла.
if (!xml_parse($parser,$xml,true))
// Парсер возвращает значение FALSE, если произошла
// какая-либо ошибка. В этом случае мы также прекращаем
// выполнение скрипта и возвращаем ошибку.
    die(sprintf('Ошибка XML: %s в строке %d',
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)));
// Уничтожаем парсер, освобождая занятые им ресурсы
xml_parser_free($parser);
print_r($day);
?>

Но эти строки из XML не идентифицируются, т.к. данные в них заключены в одинаковые теги (min и max:(

Код:
<t> 
				<min>4</min> 
				<max>6</max> 
			</t> 
			<p> 
				<min>759</min> 
				<max>762</max> 
			</p> 
			<wind> 
				<min>2</min> 
				<max>4</max> 
				<rumb>134</rumb> 
			</wind> 
			<hmid> 
				<min>73</min> 
				<max>79</max> 
			</hmid>

Подскажите, что и как нужно сделать, буду премного благодарен.
 
на SimpleXML это делается легко, просто и красиво!
 
А у кого есть на SimpleXML? Я его не понимаю:bc:
 
PHP:
$xml = <<<HTML
<forecast version="1.2" last_updated="Thu, 12 Mar 2009 19:06:53 +0200">
	<forecast>
		<day date="2009-03-12" hour="21">
			<cloud>30</cloud>
			<pict>_3_pasmurno.gif</pict>
			<ppcp>45</ppcp>
			<t>
				<min>4</min>
				<max>6</max>
			</t>
			<p>
				<min>759</min>
				<max>762</max>
			</p>
			<wind>
				<min>2</min>
				<max>4</max>
				<rumb>134</rumb>
			</wind>
			<hmid>
				<min>73</min>
				<max>79</max>
			</hmid>
			<wpi>85</wpi>
		</day>
	</forecast>
</forecast>
HTML;
$dom = new DOMDocument();//новый дом
$dom->loadXML($xml);//для загрузки из файла ->load($namefile)
$domxp = new DOMXPath($dom);//новый xpatch
$result = $domxp->query("//day/cloud");//запрос нода cloud
echo $result->item(0)->nodeValue;//вывод первого,если значение не единично то через foreach
$result = $domxp->query("//day/@date");//вывод атрибута
echo $result->item(0)->nodeValue;
вот пример, дальше по аналогии. Здесь DOMXML используется
 
у меня так сделана, может пригодится кому, где нашел код непомню
<p align="center"><font color="#000080" size="2"><b>ПОГОДА в Мариуполе</b></font></p>
<?
$source = 'http://informer.gismeteo.ru/xml/34712_1.xml';
$weekday = array('','воскресенье','понедельник','вторник','среда','чертверг','пятница','суббота');
$tod = array('ночь','утро','день','вечер');
$cloudiness = array('ясно', 'малооблачно', 'облачно', 'пасмурно');
$precipitation = array(4=>'дождь', 5=>'ливень', 6=>'снег', 7=>'снег', 8=>'гроза', 9=>'нет данных', 10=>'без осадков');
$xmlstr = '';

$fp = fopen($source, 'r');
if ( $fp ) {
while (!feof($fp)) $xmlstr.= fread($fp, 8192);
$xml = new SimpleXMLElement($xmlstr);
// echo '<pre>'; var_dump($xml->REPORT); echo '</pre>';

$town = $xml->REPORT->TOWN[0];


echo '<table border="1" width="100%"><tr>';
foreach ($xml->REPORT->TOWN->FORECAST as $f) {
echo '<td align="center"><font color="#000080" size="2">'.
$f['day'].'.'.$f['month'].'.'.$f['year'].'<br>'.
$weekday[intval($f['weekday'])].'<br>'.
$tod[intval($f['tod'])].'<br>'.
'облачность: '.$cloudiness[intval($f->PHENOMENA['cloudiness'])].'<br>'.
'осадки: '.$precipitation[intval($f->PHENOMENA['precipitation'])].'<br>'.
'давление: '.$f->PRESSURE['min'].'-'.$f->PRESSURE['max'].' мм.рт.ст.<br>'.
'температура: '.$f->TEMPERATURE['min'].'-'.$f->TEMPERATURE['max'].'<br>'.
'ветер: '.$f->WIND['min'].'-'.$f->WIND['max'].' м.с.<br>';
'влажность: '.$f->RELWET['min'].'-'.$f->RELWET['max'].'%<br>'.
'</td>';
}
echo '</tr></table>';
}
?>
 
  • Заблокирован
  • #7
На неделю, гисметео халявно экспорт не дают..., да и впрочем никто наверно из русских это не дает...
Нужно пасить сайт...
 
На неделю, гисметео халявно экспорт не дают..., да и впрочем никто наверно из русских это не дает...
Нужно пасить сайт...
weather.co.ua - Отличный сервис. Импорт в XML. Бесплатно. И не требуют размещения ссылки!!!
 
Назад
Сверху