Problema parseando XML

32 views
Skip to first unread message

Manuel Martín (DraXus)

unread,
May 4, 2009, 6:52:28 PM5/4/09
to Grupo de Usuarios de Perl de la UGR - Granada Perl Mongers
Hola a todos,

Estoy intentando leer un archivo XML tal que así:
<quiniela>
<partido>
<local>equipo a</local>
<visitante>equipo b</visitante>
<resultado>1</resultado>
</partido>
<partido>
<local>equipo c</local>
<visitante>equipo d</visitante>
<resultado>X</resultado>
</partido>
<partido>
<local>equipo e</local>
<visitante>equipo f</visitante>
<resultado>2</resultado>
</partido>
</quiniela>

Y simplemente lo que hago con este script como este:
#!/usr/bin/perl

use XML::Simple;
my $doc = XMLin("quiniela.xml");
for( @{$doc->{partido}} ){
print "$_->{local} vs $_->{visitante} = $_->{resultado}";
}

Hasta ahí todo bien, pero si ahora edito el archivo xml y añado un
atributo a todos los partidos partido tal que así: <partido
id="1">......</partido>, el script deja de funcionar saltándome este
error: Not an ARRAY reference at quiniela.cgi line 5 (en el for).

Lo curioso es que si lo hago en todos los partidos menos en uno, el
script funciona correctamente imprimiendo todos los partidos con sus
respectivos ids.

¿Qué explicación tiene esto? ¿Cómo puedo solucionarlo?

Un saludo y gracias,
Manuel

JJ Merelo

unread,
May 5, 2009, 3:52:57 AM5/5/09
to gup...@googlegroups.com
El módulo XML::Simple es bastante jodido, y procesa cada cosa como le
da la gana. Es mejor usar otros, por ejemplo, XML::Parser::EasyTree
En este caso, lo que te está diciendo es que el $_ no es un array,
sino un escalar. Puedes solucionarlo comprobando si lo es (ref $_
devolvería null), y en ese caso, imprimiéndolo directamente.
--
JJ

Manuel (DraXus)

unread,
May 5, 2009, 4:26:54 AM5/5/09
to gup...@googlegroups.com
Efectivamente, al tener todos los nodos un atributo id, lo que hace $doc->{partido} es devolverte un hash cuyas claves son las ids y el valor es un hash con los hijos de partido.

Sí que es enrevesada la XML::Simple...

Muchas gracias!

2009/5/5 JJ Merelo <jjme...@gmail.com>



--
WebSite: http://draxus.org

Por favor, si desea mandarme cualquier documento, utilice formatos estándar (ODF, PDF, HTML...). Gracias.

Please, if you wish to send me some documents, use standard formats (ODF, PDF, HTML...). Thanks.
Reply all
Reply to author
Forward
0 new messages