Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > xml::LibXML разбор на лету


Автор: shamber 21.3.2014, 17:04
Всем здравствуйте!

Возможно ли парсить 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, но где его использовать не пойму.


Автор: Bulat 24.3.2014, 07:37
shamber, а если попробовать вынести 
Код

my $parser = XML::LibXML->new;


за пределы функции, как глобальную переменную??

Автор: shamber 24.3.2014, 08:10
Цитата(Bulat @  24.3.2014,  07:37 Найти цитируемый пост)
за пределы функции, как глобальную переменную?? 


А как это должно помочь?

Автор: shamber 24.3.2014, 08:28
Думаю, что я буду регулярками парсить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)