use Scalar::Util qw[blessed]; use XML::LibXML; use XML::LibXML::PrettyPrint qw[print_xml]; sub element { my $elem = XML::LibXML::Element->new(shift); foreach my $child (@_) { if (blessed $child and $child->isa('XML::LibXML::Node')) { $elem->appendChild($child); } elsif (ref $child eq 'HASH') { $elem->{$_} = $child->{$_} foreach keys %$child; } else { $elem->appendText($child); } } return $elem; } print_xml element opt => ( element key0 => ( element devices => ( element dev0 => ( element(param => { id => "name"}, "joe"), element(param => { id => "type"}, "user"), ), ), ), );