Всем здравствуйте!
Возможно ли парсить xml частями?
| Код | use LWP::UserAgent; use XML::LibXML::Reader;
my $old;
my $data; my $start; my $deep;
my $url = 'http://ria.ru/export/rss2/politics/index.xml'; my $ttlDown = 0; my $xml = "<?xml version='1.0' encoding='UTF-8'?>"; my $resp = LWP::UserAgent->new()->get($url, ':content_cb' => sub { my ($data, $response) = @_; my $size = $response->content_length; $ttlDown += length $data; if (defined $old){ #после этого парсер умирает my $name =$old->nodeName; my $text = $old->toString; $text =~ s/(.*)(\<\/.*)$/$1/; $data = $xml.$text.$data;
} my $parser = XML::LibXML->new; my $doc; eval { $parser->push($data ); $doc = $parser->finish_push(1); }; if ( $@ ) { # парсер сдох }else{ $deep = $doc->indexElements(); my $root = $doc->documentElement(); parce ($root); }
});
sub parce{ my $root = shift; if ($root->nodeType == XML_READER_TYPE_TEXT){ return $root->nodeValue(); }elsif($root->nodeType == XML_READER_TYPE_ELEMENT){ $deep--; if ($deep ==0){ #сохраняем последний элемент, чтобы добавить к нему данные $old = $root; } my $content = $root->nodeName; if($content eq 'item'){ $start = 1; }elsif($content eq 'title'){ $data->{title} = $root->textContent; return; }elsif($content eq 'link'){ $data->{link} = $root->textContent; return; } print $root->textContent;
if($root->hasChildNodes()){ my @child = $root->childNodes(); while(my $str = shift @child){ next if $str->nodeType == XML_READER_TYPE_TEXT; parce($str); } }else{ my $s = $root->nodeValue(); } } }
|
Когда я получаю первую порцию, то парсер отрабатывает нормально. Однако после добавления данных он спотыкается. Понимаю, что проблема в Encode, но где его использовать не пойму.
|