#!/usr/bin/perl -w # $Id: bench_libxml_by_step_complex,v 1.3 2003/09/19 18:52:26 mrodrigu Exp $ use strict; use simple_benchmark; # to get memory size use File::Copy; use XML::LibXML; use Getopt::Long; my( $in_file, $print); GetOptions( 'print!' => \$print, 'in_file=s' =>\$in_file); $in_file ||= 'test.xml'; $print= 1 unless( defined $print); my %action=( delete => \&elt_delete, prefix => \&elt_prefix, duplicate => \&elt_duplicate, change_tag => \&elt_change_tag, erase => \&elt_erase, add_att => \&elt_add_att, ); my $tmp = 'temp.out'; if( -e $tmp) { unlink $tmp or die "cannot remove $tmp: $!" }; my $parser= XML::LibXML->new(); my $doc; foreach my $action (keys %action) { $doc= $parser->parse_file( $in_file); foreach my $elt ($doc->findnodes( qq{//process[\@action="$action"]})) { $action{$action}->( $doc, $elt) } open( OUT, ">$tmp") or die "cannot open $tmp"; print OUT $doc->toString; close OUT; $in_file= $tmp; } print $doc->toString if( $print); sub elt_delete { my( $doc, $elt)= @_; $elt->parentNode->removeChild( $elt); } sub elt_prefix { my( $doc, $elt)= @_; my $prefix= $doc->createElement( 'prefix'); $prefix->appendTextNode( 'prefixed '); if( my $child= $elt->getFirstChild) { $elt->insertBefore( $prefix, $elt->getFirstChild); } else { $elt->appendChild( $prefix); } } sub elt_duplicate { my( $doc, $elt)= @_; my $duplicate= $elt->cloneNode( 1); my $parent= $elt->parentNode; $parent->insertAfter( $duplicate, $elt); } sub elt_change_tag { my( $doc, $elt)= @_; $elt->setNodeName( 'new_tag'); } sub elt_erase { my( $doc, $elt)= @_; my @children= $elt->childNodes; my $parent= $elt->parentNode; foreach my $child (@children) { $child->unbindNode; $parent->insertBefore( $child, $elt); } $elt->unbindNode; } sub elt_add_att { my( $doc, $elt)= @_; $elt->setAttribute( new_att => "foo"); }