sub _xml_serialize {
my $self = shift;
my($parent_node, $tree) = @_;
no warnings 'uninitialized';
while(my($k, $v) = each %$tree) {
if(ref $v eq 'HASH') {
my $child_node = XML::LibXML::Element->new($k);
$self->_xml_serialize($child_node, $v);
$parent_node->appendChild($child_node)
}
elsif(ref $v eq 'ARRAY') {
foreach(@$v) {
my $child_node = XML::LibXML::Element->new($k);
if(ref eq 'HASH' or ref eq 'ARRAY') { $self->_xml_serialize($child_node, $_) }
else { $child_node->appendText($_) }
$parent_node->appendChild($child_node)
}
}
else {
if($k =~ s/^-//o) { $parent_node->setAttribute($k, $v) } # just one line of code for handling attributes
elsif($k =~ s/^\+//o) { $parent_node->appendText($v) } # and one for text childs
else { $parent_node->appendTextChild($k, $v) }
}
}
}
####
$qiwi->_xml_create(outer => {'-outer-attr' => 'val', '+' => 'outer text'})
####
...outer text...