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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Разбор XML путем xml_parse. Эпилог
 
 автор: 1999   (02.04.2007 в 23:01)   письмо автору
 
 

Надеюсь конец эпопеи с разбором RSS. Теперь вся проблема заключается в области видимости переменной $heap: разбор должен идти внутри функции (таковы особенности CMS), а переменная $heap хоть и глобальна, но почему-то не меняется. Вот код:

<?php

$url 
"http://news.yandex.ru/Russia/computers.rss";
$res file_get_contents$url );
$heap['level'] = 0;
$heap['ref'] = array();

/*function curl_get_contents( $url )
{
    $r = curl_init();
    curl_setopt( $r,CURLOPT_NOPROGRESS,0 );
    curl_setopt( $r,CURLOPT_RETURNTRANSFER,1 );
    curl_setopt( $r,CURLOPT_URL,$url );
    return curl_exec( $r );
}*/

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

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

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

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

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

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

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

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,$res );

    echo 
"<pre>";
    
// ['ref']['sub']['RSS'][0]['sub']['CHANNEL'][0]['sub']['ITEM']
    
print_r$heap );
}

process();

?>


И что обидно на выходе имеем

Array
(
    [level] => 0
    [ref] => Array
        (
        )

)


прошу форумчан помочь, поскольку как я ни пытался с помощью Trianon'а и без - ничего не заработало((

   
 
 автор: XPraptor   (03.04.2007 в 12:17)   письмо автору
 
   для: 1999   (02.04.2007 в 23:01)
 

Чтобы объявлять глобальную переменную $heap внутри функции, она должна быть объявлена глобальной и снаружи. в самом верху своего кода ставь после
<?php
global $heap;
$heap=array(); //чтобы не было у PHP ни одного шанса для не верного толкования

   
 
 автор: Trianon   (03.04.2007 в 12:56)   письмо автору
 
   для: XPraptor   (03.04.2007 в 12:17)
 

Переменную можно объявить и создать глобальной прямо из тела функции, не упоминая имя на внешнем уровне вообще.

   
 
 автор: Trianon   (03.04.2007 в 13:06)   письмо автору
 
   для: 1999   (02.04.2007 в 23:01)
 

В этом коде у Вас в функции process не определена переменная $res .
Либо читайте поток прямо в функции - либо передавайте её параметром.
Если бы Вы включили диагностику ошибок E_ALL - не пришлось бы вслепую тыкаться.

Ошибка не имеет никакого отношения к разбору XML.

   
 
 автор: 1999   (03.04.2007 в 18:13)   письмо автору
 
   для: Trianon   (03.04.2007 в 13:06)
 

Trianon, спасибо за все.

   
 
 автор: 1999   (07.04.2007 в 23:10)   письмо автору
 
   для: 1999   (03.04.2007 в 18:13)
 

как-то странно... дома все работало, на хостинге выводит просто это:

Array
(
    [0] => Array
        (
            [data] => 
            [sub] => Array
                (
                    [TITLE] => Array
                        (
                            [0] => Array
                                (
                                    [data] => 
                                )

                        )

                    [LINK] => Array
                        (
                            [0] => Array
                                (
                                    [data] => http://news.yandex.ru/yandsearch?cl4url=www.rian.ru/sport/tennis/20070407/63291856.html&country=Russia
                                )

                        )

                    [DESCRIPTION] => Array
                        (
                            [0] => Array
                                (
                                    [data] => 


                                )

                        )

                    [PUBDATE] => Array
                        (
                            [0] => Array
                                (
                                    [data] => Sat, 07 Apr 2007 19:20:22 +0400
                                )

                        )

                    [GUID] => Array
                        (
                            [0] => Array
                                (
                                    [data] => http://news.yandex.ru/yandsearch?cl4url=www.rian.ru/sport/tennis/20070407/63291856.html&country=Russia
                                )

                        )

                )

        )


т.е. всегда видит токо урл... как так?

   
Rambler's Top100
вверх

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