The documentation of XML::Simple shows you exactly how to do this. (see the Quick Start section)
Here's how I changed your code:
#!/usr/bin/perl
use strict;
use warnings FATAL => 'uninitialized';
use XML::Simple qw(:strict);
use Data::Dumper;
$| = 1;
my %ref;
# create 1st node
push(@{$ref{'node'}},{
'id' => 'net_1.2.3.0',
'desc' => ['network'],
});
# create 2nd node
push(@{$ref{'node'}},{
'id' => 'ip_1.2.3.4',
'desc' => ['ipaddr'],
});
my $xmlParser = XML::Simple->new();
my $fh;open $fh,'>','testfile.xml' or die "$!";
$xmlParser->XMLout(\%ref,(
'XMLDecl' => '<?xml version="1.0" encoding="utf-8"?>',
'NoAttr' => 0,
'KeepRoot' => 0,
'RootName' => 'test',
'OutputFile' => $fh,
'AttrIndent' => 1,
'KeyAttr' => { 'node' => 'id' },
));
print Dumper \%ref;
Here's the script output:
$VAR1 = {
'node' => [
{
'desc' => [
'network'
],
'id' => 'net_1.2.3.0'
},
{
'desc' => [
'ipaddr'
],
'id' => 'ip_1.2.3.4'
}
]
};
Here's the XML file that was created:
<?xml version="1.0" encoding="utf-8"?>
<test>
<node id="net_1.2.3.0">
<desc>network</desc>
</node>
<node id="ip_1.2.3.4">
<desc>ipaddr</desc>
</node>
</test>
Basically, I just changed the 'desc' element from being a hash to be a hash of an array instead.