为什么我在输出中两次得到我的字符串?
#!/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>
答案 0 :(得分: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 /
答案 1 :(得分:4)
您的程序错误地使用XML :: Twig。 According to the documentation,你应该“永远冲洗树枝,而不是元素。”
将cd_catalogue
更改为
sub cd_catalogue {
my( $t, $cd_catalogue ) = @_;
$t->flush;
}
获得预期的行为。