I am looking forward to your answer to the OP's question based on XML::Rules.
I've posted about XML::Rules as a replacement for XML::Simple before: Re: What is correct way to reference?, Re^2: hashref with(out) arrays. The following at least generates a consistent Perl data structure, and can be adapted as needed.
use warnings;
use strict;
use XML::Rules;
use Data::Dump;
my $parser = XML::Rules->new(
stripspaces => 3|4,
rules => [ _default => 'raw' ],
);
dd $parser->parse(<<'ENDXML');
<xmltop>
<xmlbody>
<tag1>jdjdjdjd</tag1>
<tag2>dkdkkd</tag2>
</xmlbody>
</xmltop>
ENDXML
__END__
[
"xmltop",
{
_content => [
[
"xmlbody",
{
_content => [
["tag1", { _content => "jdjdjdjd" }],
["tag2", { _content => "dkdkkd" }],
],
},
],
],
},
]
Update: One possible caveat here is that if an XML element has an attribute _content, then its value will be prepended to the node's text content.