Why do I get this "not an array reference" with Perl XML::Simple?

perl, xml, xml-parsing

Solution

`{$data->{$_}` is not a valid array reference because you have only one IDA tag, thus no array is built. You can use `ForceArray` in XMLin to force every tag to be an array even if there's only one.

my $data = $xml->XMLin("xmlfile.xml", ForceArray => 1);

EDIT: now it's giving the error with IDB tag...

Alternatively you can use `ref()` to check if it's an array or a hash reference:

if (ref({$data->{$_}) eq 'ARRAY')
{
    foreach $id (@{$data->{$_}})
    {
        etc...
    }
}

PS: also may I suggest using `keys()` function to retreive the keys of the hash instead of having them in a separate array.

Problem

My input xml file is: ``` <?xml version='1.0'?> <warnings> <IDA> <file>filea</file> <path>patha</path> </IDA> <IDA> <file>fileaa</file> <path>pathaa</path> </IDA> <IDB> <file>fileb</file> <path>pathb</path> </IDB> </warnings> ``` I am reading this file like this: ``` my @IDs = ("IDA", "IDB"); my $data = $xml->XMLin("xmlfile.xml"); foreach (@IDs) { foreach $id (@{$data->{$_}}) { print $id->{path}."\n"; } } ``` and when I run the script it gives me this error: ``` Not an ARRAY reference at ./waiver.pl line 18. ``` (line 18 is the second foreach loop) EDIT i have duplicated IDA tag.

Original source