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> 

改变你的子使用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/

您的程序错误地使用了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 2010-01-07 11:10:54

+3

是的,冲洗一个元素冲到该元素,我会修复文档。谢谢 – mirod 2010-01-10 10:13:22