my $tree = { arr => { elem => [ { mod => 'mstring1', rp => 'rstring1', subarr => { subelem => [ {content=>'...'}, {content=>'...'}, ] } }, { mod => 'mstring2', rp => 'rstring2', subarr => { subelem => [ {content=>'...'}, {content=>'...'}, ] } }, ], } }; #### my $tree = { arr => { elem => [ { mod => { content => 'mstring1' }, <------ rp => 'rstring1', subarr => { subelem => [ {content=>'...'}, {content=>'...'}, ] } }, { mod => { content => 'mstring2' }, <------ rp => 'rstring2', subarr => { subelem => [ {content=>'...'}, {content=>'...'}, ] } }, ], } }; #### use strict; use warnings; use Data::Dumper qw( Dumper ); use XML::Simple qw( ); local $XML::Simple::PREFERRED_PARSER = 'XML::Parser'; my $xs = XML::Simple->new( ForceArray => [qw( elem subelem )], ForceContent => 1, #ContentKey => '_text', KeyAttr => {}, KeepRoot => 1, ); my $tree = $xs->XMLin(<<'__EOI__'); mstring1 ... ... mstring2 ... ... __EOI__ { local $Data::Dumper::Indent = 1; print(Dumper($tree)); } print $xs->XMLout($tree);