#!/usr/bin/perl use strict; use warnings; use File::Find::Rule; use XML::LibXML; # get a list of target files my $input_folder = 'input'; # whatever my @files = File::Find::Rule->file->in( $input_folder ); # initiate XML parser my $parser = XML::LibXML->new; $parser->expand_entities( 0 ); # leave entities alone # go through target files, collecting elements of interest my @wanted; foreach my $file ( @files ) { # parse XML my $dom = $parser->parse_file( $file ); # input # select and store all top level elements push @wanted, $dom->documentElement->findnodes( './*' ); } # make a new document my $new = XML::LibXML::Document->new( '1.0', 'UTF-8' ); # add root element my $root = XML::LibXML::Element->new( 'xml' ); $new->addChild( $root ); # add the inner elements we've collected $root->addChild( $_ ) for @wanted; # output print $new->toString;