Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> xml::LibXML разбор на лету 
:(
    Опции темы
shamber
Дата 21.3.2014, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Всем здравствуйте!

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


PM MAIL Jabber   Вверх
Bulat
Дата 24.3.2014, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



shamber, а если попробовать вынести 
Код

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


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


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
shamber
Дата 24.3.2014, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



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


А как это должно помочь?
PM MAIL Jabber   Вверх
shamber
Дата 24.3.2014, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Думаю, что я буду регулярками парсить.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1195 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.