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

Форум PHP

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

 

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

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

тема: Разбор RSS вне зависимости от порядка элементов

Сообщения:  [1-10]    [11-20]  [21-26] 

 
 автор: Trianon   (02.04.2007 в 20:56)   письмо автору
 
   для: 1999   (02.04.2007 в 20:51)
 

вот эти две строки

$heap['level'] = 0; 
$heap['ref'] = array(); 
снизу надо убрать.

А метод изменить так:

  public function process() 
    { 
        global $heap; 

        $p = xml_parser_create(); 
        xml_set_element_handler( $p,"start_element","end_element" ); 
        xml_set_character_data_handler( $p,"element_data" ); 
        
        $heap = array('level' => 0, 'ref' => array());
        xml_parse( $p,$url ); 
        echo "<pre>";         print_r( $heap ); // вместо этой строки нужно поставить код  упрощения и переноса дерева в объект.
        $heap = array();
    } 


Функции start_element, end_element и element_data из методов класса - выкинуть.
Поставить обычными функциями с глобальной областью видимости и временем жизни .

   
 
 автор: 1999   (02.04.2007 в 20:56)   письмо автору
 
   для: 1999   (02.04.2007 в 00:11)
 

бьюсь как рыба об лед башкой и понимаю что я ламер страшный, раз такого не понимаю...
вот код теперь:

<?php

class rss_feed
{
    public 
$feed_content;

    public function 
__construct$url )
    {
        
$this->rss_feed$url );
    }

    public function 
rss_feed$url )
    {
        
$this->feed_content $this->load_through_fgc$url );
    }

    
// Загрузка через file_get_contents
    
private function load_through_fgc$url )
    {
        
$this->feed_content file_get_contents$url );
    }

    
// Загрузка через CURL
    
public function load_through_curl$url )
    {
        
$r curl_init();
        
curl_setopt$r,CURLOPT_NOPROGRESS,);
        
curl_setopt$r,CURLOPT_RETURNTRANSFER,);
        
curl_setopt$r,CURLOPT_URL,$url );
        
$this->feed_content curl_exec$r );
    }

    
// Процессинг фида
    
public function process()
    {
        global 
$heap;

        
$p xml_parser_create();
        
xml_set_element_handler$p,"start_element","end_element" );
        
xml_set_character_data_handler$p,"element_data" );
        
xml_parse$p,$url );

        echo 
"<pre>";
        
print_r$heap );
    }

    private function 
start_element$par,$name,$atr )
    {
        global 
$heap;

        
$tmp = array( "data" => "",
                      
"name" => $name,
                      
"atr" => $atr );

        
$l $heap['level'] + 1;
        
$lp $l 1;
        
$heap['stack'][$l] = $heap['ref'];
        
$heap['ref'] = array( "data" => "" );
        if ( !empty( 
$atr ) ) $heap['ref']['atr'] = $atr;
    }

    private function 
end_element$par,$name )
    {
        global 
$heap;

        
$l $heap['level'] - 1;
        
$ln $l 1;
        
$tmp $heap['ref'];
        
$heap['ref'] = $heap['stack'][$ln];
        unset( 
$heap['stack'][$ln] );
        
$heap['ref']['sub'][$name][] = $tmp;
    }

    private function 
element_data$par,$data )
    {
        global 
$heap;

        if( 
trim$data ) != "" )
        {
            
$heap['ref']['data'] .= iconv"UTF-8","WINDOWS-1251",$data );
        }
    }
}

$heap['level'] = 0;
$heap['ref'] = array();

$feed = new rss_feed"http://news.yandex.ru/Russia/computers.rss" );
$feed->process();

?>


вроде и heap уже гломальна, но тем не менее воз и ныне там((

   
 
 автор: 1999   (02.04.2007 в 20:51)   письмо автору
 
   для: 1999   (02.04.2007 в 00:11)
 

бьюсь как рыба об лед башкой и понимаю что я ламер страшный, раз такого не понимаю...
вот код теперь:

<?php

class rss_feed
{
    public 
$feed_content;

    public function 
__construct$url )
    {
        
$this->rss_feed$url );
    }

    public function 
rss_feed$url )
    {
        
$this->feed_content $this->load_through_fgc$url );
    }

    
// Загрузка через file_get_contents
    
private function load_through_fgc$url )
    {
        
$this->feed_content file_get_contents$url );
    }

    
// Загрузка через CURL
    
public function load_through_curl$url )
    {
        
$r curl_init();
        
curl_setopt$r,CURLOPT_NOPROGRESS,);
        
curl_setopt$r,CURLOPT_RETURNTRANSFER,);
        
curl_setopt$r,CURLOPT_URL,$url );
        
$this->feed_content curl_exec$r );
    }

    
// Процессинг фида
    
public function process()
    {
        global 
$heap;

        
$p xml_parser_create();
        
xml_set_element_handler$p,"start_element","end_element" );
        
xml_set_character_data_handler$p,"element_data" );
        
xml_parse$p,$url );

        echo 
"<pre>";
        
print_r$heap );
    }

    private function 
start_element$par,$name,$atr )
    {
        global 
$heap;

        
$tmp = array( "data" => "",
                      
"name" => $name,
                      
"atr" => $atr );

        
$l $heap['level'] + 1;
        
$lp $l 1;
        
$heap['stack'][$l] = $heap['ref'];
        
$heap['ref'] = array( "data" => "" );
        if ( !empty( 
$atr ) ) $heap['ref']['atr'] = $atr;
    }

    private function 
end_element$par,$name )
    {
        global 
$heap;

        
$l $heap['level'] - 1;
        
$ln $l 1;
        
$tmp $heap['ref'];
        
$heap['ref'] = $heap['stack'][$ln];
        unset( 
$heap['stack'][$ln] );
        
$heap['ref']['sub'][$name][] = $tmp;
    }

    private function 
element_data$par,$data )
    {
        global 
$heap;

        if( 
trim$data ) != "" )
        {
            
$heap['ref']['data'] .= iconv"UTF-8","WINDOWS-1251",$data );
        }
    }
}

$heap['level'] = 0;
$heap['ref'] = array();

$feed = new rss_feed"http://news.yandex.ru/Russia/computers.rss" );
$feed->process();

?>


вроде и heap уже гломальна, но тем не менее воз и ныне там((

   
 
 автор: Trianon   (02.04.2007 в 20:28)   письмо автору
 
   для: 1999   (02.04.2007 в 20:18)
 

global $heap;

Она не только должна быть видна в других местах. Она не должна являться членом(полем) класса. Впрочем, возможно её можно сделать ссылкой на такое поле. Но этого я не проверял. Собственно, если реентерабельность не требуется (не требуется разбирать в обдом скрипте два RSS-потока параллельно) то я не очень себе представляюю смысл всех этих ухищрений.

   
 
 автор: 1999   (02.04.2007 в 20:18)   письмо автору
 
   для: Trianon   (02.04.2007 в 19:50)
 

ну я реально не понимаю как сделать, чтобы эта $heap была видна в других местах((

   
 
 автор: Trianon   (02.04.2007 в 19:50)   письмо автору
 
   для: 1999   (02.04.2007 в 19:30)
 

.

   
 
 автор: 1999   (02.04.2007 в 19:30)   письмо автору
 
   для: Trianon   (02.04.2007 в 09:48)
 

.

   
 
 автор: 1999   (02.04.2007 в 10:10)   письмо автору
 
   для: Trianon   (02.04.2007 в 09:48)
 

эх... я даж вроде как примерно понял, но вот реализовать все ваши умные слова не могу((
может подскажете, где и что исправить, чтобы все работало?..

   
 
 автор: Trianon   (02.04.2007 в 09:48)   письмо автору
 
   для: 1999   (01.04.2007 в 21:56)
 

> Такая проблема вышла - нижнюю итоговую часть (начиная с xml_parser_create и заканчивая
> xml_parse) необходимо использовать внутри функции(( как ни извращался - $heap не
> виден функциям start_element итд. Пытался извратиться вобще так:

Я в Вашем коде не нашел функций start_element, end_element, element_data. Нашел только методы. Методы и функции - разные вещи.

механизм xml_parse требует именно функций. Функциям этим негде взять контекст выполнения, кроме как из некоторой переменной с глобальной областью видимости.

Делать глобальным сам объект, передавая его в парсер, или оставить глобальной кучу результата, а потом обращаться к ней в конце разбора и переносить результат в объект - дело вкуса. Но некоторую глобальную сущность придется оставить - у функций разбора нет доп. параметра, через который передавался бы контекст выполнения.

   
 
 автор: 1999   (02.04.2007 в 00:11)   письмо автору
 
   для: 1999   (01.04.2007 в 21:56)
 

.

   

Сообщения:  [1-10]    [11-20]  [21-26] 

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

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