|
|
|
|
|
для: 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 в 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,0 );
curl_setopt( $r,CURLOPT_RETURNTRANSFER,1 );
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 в 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,0 );
curl_setopt( $r,CURLOPT_RETURNTRANSFER,1 );
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:18)
| | global $heap;
Она не только должна быть видна в других местах. Она не должна являться членом(полем) класса. Впрочем, возможно её можно сделать ссылкой на такое поле. Но этого я не проверял. Собственно, если реентерабельность не требуется (не требуется разбирать в обдом скрипте два RSS-потока параллельно) то я не очень себе представляюю смысл всех этих ухищрений. | |
|
|
|
|
|
|
|
для: Trianon
(02.04.2007 в 19:50)
| | ну я реально не понимаю как сделать, чтобы эта $heap была видна в других местах(( | |
|
|
|
|
|
|
|
для: 1999
(02.04.2007 в 19:30)
| | . | |
|
|
|
|
|
|
|
для: 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
(01.04.2007 в 21:56)
| | . | |
|
|
|
|