| |
|
|
| | Дано:
дан файл:
http://informer.gismeteo.Ru/xmlinf/27612_1.xml
|
- надо ег опропарсить.
Вот код который я написал, с локальным файлом он работает - а когда полный путь пишу - нехочет работать, в чем ошибка ??? файл - в коде: $xml = join('',file('news.xml'));
вот ссылка на ресурс, для помощи http://informer.gismeteo.ru/xml.html?index=27612
<?php
$FORECAST = array(); // В этом массиве будут храниться новости,
// полученные из XML файла
$currentFORECAST = null; // Текущая новость. Используется в процессе
// импорта данных
$index = null; // Текущий индекс в массиве новостей.
// Используется в процессе импорта данных
// Функция для обработки начальных тегов XML
// На входе:
// - указатель на SAX парсер
// - имя XML тега
// - массив аттрибутов
function saxStartElement($parser,$name,$attrs)
{
global $currentFORECAST ,$index;
switch($name)
{
case 'MMWEATHER':
// Тег FORECAST dayLine содержит все новости. Мы должны подготовить
// массив $FORECAST day для приема новостей из XML файла.
$FORECAST = array();
break;
case 'FORECAST':
// Каждая новость находится в теге FORECAST day. Подготавливаем массив
// $currentFORECAST day для приема этой новости
$currentFORECAST = array();
// Если у новости есть дата - сохраняем ее в массиве
if (in_array('day',array_keys($attrs)))
$currentFORECAST ['day'] = $attrs['day'];
if (in_array('month',array_keys($attrs)))
$currentFORECAST ['month'] = $attrs['month'];
if (in_array('year',array_keys($attrs)))
$currentFORECAST ['year'] = $attrs['year'];
if (in_array('tod',array_keys($attrs)))
$currentFORECAST ['tod'] = $attrs['tod'];
if (in_array('predict',array_keys($attrs)))
$currentFORECAST ['predict'] = $attrs['predict'];
if (in_array('year',array_keys($attrs)))
$currentFORECAST ['weekday'] = $attrs['weekday'];
if (in_array('weekday',array_keys($attrs)))
$currentFORECAST ['hour'] = $attrs['hour'];
break;
default:
// Все остальные теги, которые могут встретиться в XML файле
// находятся внутри тега <FORECAST day>, поэтому мы просто запоминаем
// их название с тем, чтобы знать, какие именно данные мы
// обрабатываем.
$index = $name;
break;
};
}
// Функция для обработки конечных тегов XML
// На входе:
// - указатель на SAX парсер
// - имя XML тега
function saxEndElement($parser,$name)
{
global $FORECAST ,$currentFORECAST ,$index;
if ((is_array($currentFORECAST )) && ($name=='FORECAST'))
// Если в данный момент у нас есть массив $currentFORECAST day (т.е.
// мы обрабатываем содержимое новости) и имя закрывающего
// тега - "FORECAST day", то это значит, что данные для этой новости
// кончились и мы можем поместить готовую новость в массив
// новостей.
{
$FORECAST [] = $currentFORECAST ;
// Уничтожаем массив текущей новости, чтобы показать, что
// в данный момент мы не занимаемся получением данных для
// новости.
$currentFORECAST = null;
};
// В любом случае закрытие тега означает, что символьные
// данные, получаемые парсером не нужно помещать куда-либо.
$index = null;
}
// Функция для обработки символьных данных
// На входе:
// - указатель на SAX парсер
// - символьные данные XML
function saxCharacterData($parser,$data)
{
global $currentFORECAST ,$index;
// Мы принимаем только данные для новостей, помещенные в
// какой-нибудь тег. Все остальные символьные данные
// (как правило это пустое пространство, использованное
// для форматирования) мы опускаем за ненадобностью.
if ((is_array($currentFORECAST )) && ($index))
$currentFORECAST [$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('news.xml'));
// Производим парсинг (разбор) полученного XML-файла.
// В процессе разбора парсер будет вызывать описанные нами
// функции и в результате мы получим массив $FORECAST day,
// содержащий новости из 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);
?>
<?php
foreach($FORECAST as $n)
{
echo ('День: '.$n['day'].' Месяц: '.$n['month'].
' Год: '.$n['year'].' Время: '.$n['hour'].
' Время суток: '.$n['tod'].
' Заблаговременность прогноза в часах: '.$n['predict'].
' День недели: '.$n['weekday']);
echo('<br>');
};
?>
|
| |
| |
|
|
| |
|
|
| |
для: PinPinP
(15.06.2008 в 00:28)
| | | >http://informer.gismeteo.Ru/xmlinf/27612_1.xml
404 Not Found (nginx/0.6.25)
Наверное то же самое происходит и у Вашего php | |
| |
|
|
| |
|
|
| |
для: Trianon
(15.06.2008 в 01:01)
| | | Может быть так ?
http://informer.gismeteo.ru/xml/27612_1.xml
|
| |
| |
|
|
| |
|
|
| |
для: t3ma
(15.06.2008 в 07:18)
| | | да там все нормально - может быть вообще SAX - позволяет только для локальной работы ?? если это так - значит я зря это делал ?? ну код правильный у меня - локально парсит файл - а вот из вэба никак. | |
| |
|
|
| |
|
|
| |
для: PinPinP
(15.06.2008 в 09:14)
| | | ну помогите пожалуйста - там ведь надо 1 строку подправить и все ......... | |
| |
|
|
| |
|
|
| |
для: PinPinP
(15.06.2008 в 19:48)
| | | > там ведь надо 1 строку подправить и все
Откуда Вы знаете, что одну строку? Впрочем, Вы, кажется, угадали. Вам уже сказали, что Вы указываете, по всей видимости, неверный адрес: http://informer.gismeteo.ru/xmlinf/27612_1.xml. Сервер отвечает 404, то есть никакого XML-документа там нет.
P.S. И файлы на "http://" не начинаются. | |
| |
|
|
| |
|
|
| |
для: PinPinP
(15.06.2008 в 09:14)
| | | >да там все нормально - может быть вообще SAX - позволяет только для локальной работы ??
>если это так - значит я зря это делал ?? ну код правильный у меня - локально парсит файл - а
>вот из вэба никак.
Скопируйте файл на ваш сервер при помощи функции copy(), чтобы проверить это предположение. | |
| |
|
|
| |
|
|
| |
для: cheops
(16.06.2008 в 10:29)
| | | так и сделал, локально работает. но просто зачем тогда нужен SAX, вообще мне кажется самый главный смысл грабления страницы - что она удаленно находится, а если каждый раз ее копировать и разбирать - это уже работа с файлами называется ......мне кажется что я неправильно к ней конектился к этой странице..... | |
| |
|
|
| |
|
|
| |
для: PinPinP
(17.06.2008 в 09:09)
| | | Хм... у вас скрипте имеется строка
<?php
$xml = join('',file('news.xml'));
?>
|
Вы сюда свой адрес подставляете? Если да, то скрипт должен и с удалёнными файлами работать, так как file() поддерживает сетевую работу. | |
| |
|
|