Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: XML parser

Сообщения:  [1-9] 

 
 автор: cheops   (17.06.2008 в 11:54)   письмо автору
 
   для: PinPinP   (17.06.2008 в 09:09)
 

Хм... у вас скрипте имеется строка
<?php
  $xml 
join('',file('news.xml'));
?>

Вы сюда свой адрес подставляете? Если да, то скрипт должен и с удалёнными файлами работать, так как file() поддерживает сетевую работу.

   
 
 автор: PinPinP   (17.06.2008 в 09:09)   письмо автору
 
   для: cheops   (16.06.2008 в 10:29)
 

так и сделал, локально работает. но просто зачем тогда нужен SAX, вообще мне кажется самый главный смысл грабления страницы - что она удаленно находится, а если каждый раз ее копировать и разбирать - это уже работа с файлами называется ......мне кажется что я неправильно к ней конектился к этой странице.....

   
 
 автор: cheops   (16.06.2008 в 10:29)   письмо автору
 
   для: PinPinP   (15.06.2008 в 09:14)
 

>да там все нормально - может быть вообще SAX - позволяет только для локальной работы ??
>если это так - значит я зря это делал ?? ну код правильный у меня - локально парсит файл - а
>вот из вэба никак.
Скопируйте файл на ваш сервер при помощи функции copy(), чтобы проверить это предположение.

   
 
 автор: BinLaden   (15.06.2008 в 19:54)   письмо автору
 
   для: PinPinP   (15.06.2008 в 19:48)
 

> там ведь надо 1 строку подправить и все

Откуда Вы знаете, что одну строку? Впрочем, Вы, кажется, угадали. Вам уже сказали, что Вы указываете, по всей видимости, неверный адрес: http://informer.gismeteo.ru/xmlinf/27612_1.xml. Сервер отвечает 404, то есть никакого XML-документа там нет.

P.S. И файлы на "http://" не начинаются.

   
 
 автор: PinPinP   (15.06.2008 в 19:48)   письмо автору
 
   для: PinPinP   (15.06.2008 в 09:14)
 

ну помогите пожалуйста - там ведь надо 1 строку подправить и все .........

   
 
 автор: PinPinP   (15.06.2008 в 09:14)   письмо автору
 
   для: t3ma   (15.06.2008 в 07:18)
 

да там все нормально - может быть вообще SAX - позволяет только для локальной работы ?? если это так - значит я зря это делал ?? ну код правильный у меня - локально парсит файл - а вот из вэба никак.

   
 
 автор: t3ma   (15.06.2008 в 07:18)   письмо автору
 
   для: Trianon   (15.06.2008 в 01:01)
 

Может быть так ?


http://informer.gismeteo.ru/xml/27612_1.xml

   
 
 автор: Trianon   (15.06.2008 в 01:01)   письмо автору
 
   для: PinPinP   (15.06.2008 в 00:28)
 

>http://informer.gismeteo.Ru/xmlinf/27612_1.xml

404 Not Found (nginx/0.6.25)

Наверное то же самое происходит и у Вашего php

   
 
 автор: PinPinP   (15.06.2008 в 00:28)   письмо автору
 
 

Дано:
дан файл:
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>');
};


?>

   

Сообщения:  [1-9] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования