2010-01-07 7 views
3

Pourquoi ai-je ma chaîne deux fois dans la sortie?Pourquoi XML :: Twig génère-t-il deux fois la chaîne extraite?

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

Répondre

4

Changer votre sous print à utiliser et purge au lieu de flush se déplace problème:

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

Le flush se trouble en raison de la simplicité de votre exemple parce que cd_catalogue est nœud racine. Si vous modifiez vos données à quelque chose comme ceci:

my $string = ' 
    <cds> 
     <cd_catalogue><title>Hello, World!</title></cd_catalogue> 
    </cds>'; 

ou si vous avez changé votre twig_handler pour chercher title:

twig_handlers => { title => \&cd_catalogue } 

alors vous trouverez que $cd_catalogue->flush fonctionne maintenant comme prévu avec votre $string.

/I3az/

4

Votre programme utilise XML :: Twig de manière incorrecte. According to the documentation, vous devriez toujours "vider la brindille, pas un élément."

changement cd_catalogue à

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

pour obtenir le comportement attendu.

+0

Etrangement c'est ce que j'ai mis à l'origine dans ma réponse :) Cependant la documentation dit et fournit aussi des exemples d'utilisation de flush avec des "éléments" (http://search.cpan.org/dist/XML-Twig/Twig. pm # Processing_an_XML_document_chunk_by_chunk). – draegtun

+3

oui, rinçage sur un élément flush jusqu'à cet élément, je vais réparer les docs. Merci – mirod