Почему XML :: Twig выводит извлеченную строку дважды? - PullRequest
3 голосов
/ 07 января 2010

Почему я получаю свою строку два раза в выводе?

#!/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>

Ответы [ 2 ]

4 голосов
/ 07 января 2010

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

Изменить cd_catalogue на

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

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

4 голосов
/ 07 января 2010

Изменение вашего саба на использование 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 /

...