use XML::Twig; use Data::Dumper; # let's emulate XMLin even more simple (for now) sub XMLTwin { if (-e $_[0]) { return XML::Twig->new->parsefile($_[0])->simplify( keyattr => []); } } # let's emulate XMLout even more simple than XML::Simple (for now) sub XMLTwout { my $elt; my $twig = XML::Twig->new(pretty_print => 'indented', empty_tags => 'html'); my $xmltag = "opt"; sub create_element { # needs to be a internal subroutine only for XMLTwout... my $gi = shift; my $data = shift; my $t = XML::Twig::Elt->new($gi); if (ref $data) { while (my ($k,$v) = each(%$data)) { if ($k ne "outline") { create_element($k, $v)->paste(last_child => $t); } else { $t->insert_new_elt( last_child => $k => { '#CDATA' => 1 }, $v); } } } else { $t->set_text($data); } $t; } if ($_[1]) { $xmltag = $_[1] }; $elt = create_element($xmltag => $_[0]); $twig->set_root($elt); undef($elt); # let's clear some memory here print Dumper($elt); return $twig->sprint(); } # some test code ; my $file = 'test.xml'; my $xmldata = XMLTwin($file); # let's get it in my $xmlout = XMLTwout($xmldata); # let's get it out ... print $xmlout;