#!/usr/bin/perl -w use strict; use XML::Twig; # initialize the index document # pretty_print => 'indented' gives you exactly the output you showed my $index= XML::Twig->new( pretty_print => 'record_c') ->parse( ''); my $friends= $index->root; foreach my $file (@ARGV) { my $friend; # the current friend my $t= XML::Twig->new( start_tag_handlers => { # create a new friend in the index person => sub { $friend= $friends->insert_new_elt( last_child => 'person') } }, twig_roots => { # store the elements in the friend 'person/name' => sub { $_->move( last_child => $friend); }, 'person/age' => sub { $_->move( last_child => $friend); } } ) ->parsefile( $file); } $index->print;