use strict; use warnings; use XML::Parser; use Data::Dumper; use List::Util qw(max); my $file_name; my @file_name1; my $fp1; my $xml_string; my $pkg_txt; my $got_ebook=0; my $call_grp_info = 0; my $CallDetailByService_cntr=0; my $output_file_fp; sub handle_end_xcd { my ( $expat, $element, %attrs ) = @_; my $line = $expat->current_line; my @parent_item_array=$expat->context; my $parent_tag=$parent_item_array[-1]; print $output_file_fp " IN END Element Found $element\n"; if ($element eq 'CallGroupInfo') { if ($got_ebook == 1) { print STDOUT "$xml_string\n"; } } else { print STDOUT "$xml_string\n"; } } sub handle_start_xcd { my ( $expat, $element, %attrs ) = @_; my $line = $expat->current_line; my @parent_item_array=$expat->context; my $parent_tag=$parent_item_array[-1]; if ( ($element eq 'CallGroupInfo') && ($got_ebook > 1 ) ) { $call_grp_info++; print $output_file_fp "in IF $call_grp_info\n"; if ($call_grp_info == 1) { print STDOUT "$xml_string\n"; } } elsif ($element eq "CallDetailByService") { $CallDetailByService_cntr++; if ($CallDetailByService_cntr > 1) { print STDOUT "$xml_string\n"; } } elsif ($element eq "CallGroupDescription") { print STDERR "XXX\n"; } else { print STDOUT "$xml_string\n"; } } sub char_handler { my ($p, $data) = @_; print $output_file_fp "Char handler", $p->current_element, "\n"; if ($p->current_element eq "SDPackageName") { chomp $data; # print STDERR "Package Data is:$data\n"; $got_ebook++ if ( ($data eq "eMagazine Purchase") || ($data eq "eBook Purchase") ) ; print STDOUT "$xml_string\n"; } else { print STDOUT "$xml_string\n"; } } # End char_handler @file_name1=glob("org1.xml"); my $output_file_name="test.xml"; open ($output_file_fp,">", $output_file_name); my $p1 = XML::Parser->new ( Handlers => { Start => \&handle_start_xcd, Char => \&char_handler, End => \&handle_end_xcd } ) ; foreach (@file_name1) { $file_name = $_; chomp $file_name; open($fp1,"<",$file_name); while(<$fp1>) { chomp; $xml_string=$_; #print $output_file_fp "$xml_string"; chomp $xml_string; if ( grep ( /SDPackageName/, $xml_string) || grep ( /CallGroupInfo/ ,$xml_string) || grep ( /CallDetailByService/ ,$xml_string ) || grep ( /CallGroupDescription/ ,$xml_string )) { $p1->parse($xml_string); } else { print STDOUT "$xml_string\n"; } } }