3

为什么我在输出中得到我的字符串两次?

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

2 回答 2

4

更改您的子以使用printpurge不是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/

于 2010-01-07T09:41:26.533 回答
4

您的程序错误地使用了 XML::Twig。根据文档,您应该“始终冲洗树枝,而不是元素”。

更改cd_catalogue

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

获得预期的行为。

于 2010-01-07T10:40:30.723 回答