First, please enclose your code and data inside <code></code> tags. It's almost impossible to read otherwise.
Second, please post working code. You typed in some code that has an error (@xml and $data have their sigils transposed); it makes it hard to help you when you don't paste your actual code here.
Third, you must use strict; and use warnings; in your programs, otherwise you are rejecting Perl's built-in safety features, and there's not much point in helping when a programmer is doing that.
Finally, for your question, XML::Simple maybe "best" for you, but not if you want correct results. It has a lot of limitations (see its own documentation), including in this way: it will only return one element when one or more have the same key:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml=new XML::Simple;
local $/;
my @data= $xml->XMLin( <DATA> );
print Dumper(\@data);
__DATA__
<?xml version='1.0'?>
<staff>
<employee>
<name>Pradeep</name>
<age>23</age>
<sex>M</sex>
<department>Coder</department>
</employee>
<employee>
<name>Pradeep</name>
<age>22</age>
<sex>M</sex>
<department>HR</department>
</employee>
</staff>
Output:
$VAR1 = [
{
'employee' => {
'Pradeep' => {
'department' => 'HR',
'age' => '22',
'sex' => 'M'
}
}
}
];
It works fine when the keys are distinct:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml=new XML::Simple;
local $/;
my @data= $xml->XMLin( <DATA> );
print Dumper(\@data);
__DATA__
<?xml version='1.0'?>
<staff>
<employee>
<name>Pradeep</name>
<age>23</age>
<sex>M</sex>
<department>Coder</department>
</employee>
<employee>
<name>Douglas</name>
<age>22</age>
<sex>M</sex>
<department>HR</department>
</employee>
</staff>
Output:
$VAR1 = [
{
'employee' => {
'Pradeep' => {
'age' => '23',
'department' => 'Coder',
'sex' => 'M'
},
'Douglas' => {
'age' => '22',
'sex' => 'M',
'department' => 'HR'
}
}
}
];
Many monks recommend using XML::Twig or XML::LibXML instead.
The way forward always starts with a minimal test.