• Publicidad

XML::Simple y el diferente tratamiento con más de un nodo

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

XML::Simple y el diferente tratamiento con más de un nodo

Notapor morago » 2014-04-13 02:36 @150

Tengo un problema con XML::Simple. Tengo un fichero XML de este tipo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <videos id_playList="v1a">
  2.   <video id="1a" description="d1a">
  3.     <title>"t1a"</title>
  4.   </video>
  5.   <video id="2a" description="d2a">
  6.     <title>"t2a"</title>
  7.   </video>
  8. </videos>
  9.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

En este caso hay dos elementos. Lo que ocurre es que si solo hay un elemento, XML::Simple lo trata de modo diferente y no me crea el mismo hash. Tendría que modificar el archivo xml para que lo trate igual:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use warnings;
  4. use strict;
  5. use feature qw(switch say);
  6. use Data::Dumper;
  7. use XML::Simple;
  8.  
  9.  
  10. my $xml1 = '
  11. <videos id_playList="v1a">
  12.  <video id="1a" description="d1a">
  13.    <title>"t1a"</title>
  14.  </video>
  15.  <video id="2a" description="d2a">
  16.    <title>"t2a"</title>
  17.  </video>
  18. </videos>';
  19.  
  20. my $xml2 = '
  21. <videos id_playList="v1b">
  22.  <video id="1b" description="d1b">
  23.    <title>"t1b"</title>
  24.  </video>
  25. </videos>';
  26.  
  27. my $xml3 = '
  28. <videos id_playList="v1c">
  29.  <video>
  30.    <t1c id="1c" description="d1c">
  31.    </t1c>
  32.  </video>
  33. </videos>';
  34.  
  35.  
  36. my $xml_caps = XML::Simple->new();
  37. my $res1 = $xml_caps->XMLin("$xml1", KeyAttr => { 'video' => 'title' });
  38.  
  39. my $xml_caps2 = XML::Simple->new();
  40. my $res2 = $xml_caps2->XMLin("$xml2", KeyAttr => {'video' => 'title'} );
  41.  
  42. my $xml_caps3 = XML::Simple->new();
  43. my $res3 = $xml_caps2->XMLin("$xml3");
  44.  
  45. print Dumper $res1;
  46. print "\n";
  47. print Dumper $res2;
  48. print "\n";
  49. print Dumper $res3;
  50.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Alguna solución? Gracias.
Avatar de Usuario
morago
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2009-12-13 16:43 @738

Publicidad

Re: XML::Simple y el diferente tratamiento con más de un nod

Notapor explorer » 2014-04-13 12:43 @572

La solución más inmediata es... no usar XML::Simple. A veces, complica el desarrollo de forma innecesaria. Hay otros 200 módulos en CPAN que pueden hacerlo mejor.

La otra solución, es leer, releer, y volver a leer la página de manual de este módulo para ver si encontramos alguna respuesta, y empezar a hacer docenas de pruebas hasta encontrar la solución (a mi siempre me pasa).

En tu caso, lo solucionas agregando la opción ForceArray => ['video'], a la lista de opciones de XMLin().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: XML::Simple y el diferente tratamiento con más de un nod

Notapor morago » 2014-04-13 14:25 @642

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ForceArray => ['video'], KeyAttr => [ 'title' ]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Porque si no usa 'id' por defecto, y no 'title'.

Por cierto, lo de leer, releer y probar lo has clavado :)

Como siempre, gracias por la ayuda, explorer.
Avatar de Usuario
morago
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2009-12-13 16:43 @738


Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados