2010-01-07 6 views
3

Почему я получаю свою строку два раза на выходе?Почему XML :: Twig выводит извлеченную строку дважды?

#!/usr/bin/perl 
use warnings; 
use strict; 

use XML::Twig; 


my $string = '<cd_catalogue><title>Hello, World!</title></cd_catalogue>'; 

my $t= XML::Twig->new( twig_handlers => { cd_catalogue => \&cd_catalogue, }, 
      pretty_print => 'indented', 
); 

$t->parse($string); 


sub cd_catalogue { 
    my($t, $cd_catalogue) = @_; 
    $cd_catalogue->flush; 
} 


# Output: 
#<cd_catalogue> 
# <title>Hello, World!</title> 
#</cd_catalogue> 
#<cd_catalogue> 
# <title>Hello, World!</title> 
#</cd_catalogue> 

ответ

4

Изменение ваш суб использовать print и purge вместо flush получает вокруг проблемы:

sub cd_catalogue { 
    my($t, $cd_catalogue) = @_; 
    $cd_catalogue->print; 
    $cd_catalogue->purge; 
} 

flush становится замешательстве из-за простоты вашего примера, потому что cd_catalogue является корневой узел. Если изменить свои данные на что-то вроде этого:

my $string = ' 
    <cds> 
     <cd_catalogue><title>Hello, World!</title></cd_catalogue> 
    </cds>'; 

или если вы изменили twig_handler искать title:

twig_handlers => { title => \&cd_catalogue } 

, то вы увидите, что $cd_catalogue->flush теперь работает, как ожидается, с $string.

/I3az/

4

Ваша программа использует XML :: Twig неправильно. According to the documentation, вы должны «всегда смывать веточку, а не элемент».

Изменение cd_catalogue в

sub cd_catalogue { 
    my($t, $cd_catalogue) = @_; 
    $t->flush; 
} 

получить ожидаемое поведение.

+0

Странно это то, что я изначально ставил в своем ответе :) Однако в документации действительно есть примеры использования флеша с «элементами» (http://search.cpan.org/dist/XML-Twig/Twig. вечера # Processing_an_XML_document_chunk_by_chunk). – draegtun

+3

Да, промывка элемента стирается до этого элемента, я исправлю документы. благодаря – mirod

Смежные вопросы