XML :: Twig为什么输出提取的字符串两次?
问题描述:
为什么我在输出中获得两次我的字符串?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>
答
改变你的子使用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/
答
您的程序错误地使用了XML :: Twig。 According to the documentation,你应该“总是冲洗树枝,而不是元素。”
变化cd_catalogue
到
sub cd_catalogue {
my($t, $cd_catalogue) = @_;
$t->flush;
}
得到预期的行为。
奇怪的是,这是我原来在我的答案:)然而,文档确实说,也提供了使用与“元素”冲洗的例子(http://search.cpan.org/dist/XML-Twig/Twig。下午#Processing_an_XML_document_chunk_by_chunk)。 – draegtun 2010-01-07 11:10:54
是的,冲洗一个元素冲到该元素,我会修复文档。谢谢 – mirod 2010-01-10 10:13:22