Search code examples
perlperl-modulexml-twigxdp-pdf

XML::Twig - Inplace editing


I'm trying to append timestamp at the end of xdp file. I am using XML::Twig. On running the script timestamp (<testing>4619314911532861</testing>) gets added at the end but the output is coming on STDOUT instead of testdata.xdp. What am I missing?

Code:

#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;

my $twig=XML::Twig->new(pretty_print => 'indented');
my $file = 'testdata.xdp';
$twig->parsefile_inplace($file, '.bak');
my $root= $twig->root;
my @children= $root->children;

foreach my $child (@children){
    my $eblg= new XML::Twig::Elt( 'testing', localtime);
    $eblg->paste( 'last_child', $child);
}

$twig->flush; 

Solution

  • The problem here is - parsefile_inplace works as a standalone thing. It replaces the source file immediately after the parse operation is complete.

    So to use it like that, you need to do your 'work' within twig_handlers. If you do this, it'll parse/modify/overwrite.

    E.g.:

    sub insert_after_all {
        my ( $twig, $element ) = @_;
        my $eblg= new XML::Twig::Elt( 'testing', localtime);
        $eblg->paste( 'last_child', $element);
        $twig -> flush;
    }
    
    my $twig =  XML::Twig->new(pretty_print => 'indented', 
                          twig_handlers => { '_all_' => \&insert_after_all } );
     my $file = 'testdata.xdp';
     $twig->parsefile_inplace($file, '.bak');
    

    Otherwise - rename the source, and print {$new_fh} $twig -> sprint;