|
|
|
| Надеюсь конец эпопеи с разбором 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'а и без - ничего не заработало(( | |
|
|
|
|
|
|
|
для: 1999
(02.04.2007 в 23:01)
| | Чтобы объявлять глобальную переменную $heap внутри функции, она должна быть объявлена глобальной и снаружи. в самом верху своего кода ставь после
<?php
global $heap;
$heap=array(); //чтобы не было у PHP ни одного шанса для не верного толкования | |
|
|
|
|
|
|
|
для: XPraptor
(03.04.2007 в 12:17)
| | Переменную можно объявить и создать глобальной прямо из тела функции, не упоминая имя на внешнем уровне вообще. | |
|
|
|
|
|
|
|
для: 1999
(02.04.2007 в 23:01)
| | В этом коде у Вас в функции process не определена переменная $res .
Либо читайте поток прямо в функции - либо передавайте её параметром.
Если бы Вы включили диагностику ошибок E_ALL - не пришлось бы вслепую тыкаться.
Ошибка не имеет никакого отношения к разбору XML. | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2007 в 13:06)
| | Trianon, спасибо за все. | |
|
|
|
|
|
|
|
для: 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
)
)
)
)
|
т.е. всегда видит токо урл... как так? | |
|
|
|