use strict; use warnings; use IO::String; use XML::Writer; my $struct = { epoch => time(), events => [ { type => 'move', elements => { left => 1, up => 2 } }, { type => 'pen', elements => { down => 1, color => 'red' } }, { type => 'move', elements => { right => 3, up => 1 } }, ], }; print to_xml($struct), "\n"; exit; sub to_xml { my $input = shift; my $buffer; my $io = IO::String->new($buffer); my $xml = XML::Writer->new( OUTPUT => $io, NEWLINES => 0, DATA_MODE => 1, DATA_INDENT => 2, ); $xml->xmlDecl('UTF-8'); $xml->startTag( 'block', 'time' => $input->{epoch} ); foreach my $event (@{ $input->{events} }) { $xml->emptyTag( $event->{type}, %{ $event->{elements} } ); } $xml->endTag('block'); $xml->end(); return $buffer; } ####