• Publicidad

Problemas al leer un XML

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problemas al leer un XML

Notapor fgalves » 2007-04-18 03:29 @187

Hola a todos,

Tengo problemillas al leer el siguiente fichero XML:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
$VAR1 = {
          'Type' => 'Projection',
          'Filters' => {
                       'In' => [
                               {
                                 'StatField' => {
                                                'Field' => 'Field1',
                                                'Family' => 'MDW'
                                              },
                                 'FilterList' => 'VAL1 VAL2 VAL3 VAL4'
                               },
                               {
                                 'StatField' => {
                                                'Field' => 'Field2',
                                                'Family' => 'MDW'
                                              },
                                 'FilterList' => 'YOU'
                               },
                               {
                                 'StatField' => {
                                                'Field' => 'Field3',
                                                'Family' => 'MDW'
                                              },
                                 'FilterList' => 'GY'
                               }
                             ]
                     },
                     ...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que pretendo es obtener todos los valores que aparecen con la clave 'FilterList' y almacenarlos en un array @filterList.

Usando el modulo XML::Simple, llevo hecho lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub obtainFiltersIn {
       
  my $filename = $_[0];
       
  my @filters = ();
  my $filter;
         
  my $ref = XMLin($filename);
  if ( defined($ref->{Filters}->{In}) )  {
      my @filtering = $ref->{Filters}->{In};
               
      foreach my $filterEntry (@filtering) {    
       
          my @filterList = split (/ /,$filterEntry{FilterList});
          foreach $filter (@filterList) {          
        push @filters, $filter;
          }                            
      }            
  }
 return @filters;
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


El caso es que no me parece funcionar y estoy hecho un autentico lío... :-S

¿Alguien me puede echar una mano?
¡Muchas gracias por adelantado!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor monoswim » 2007-04-18 07:53 @370

Si $ref es una estructura de datos de tu XML solamente tienes que saber usar referencias como para tomar los datos que necesitas...

Andá probando referencia por referencia hasta que llegues a lo que quieres. No es complicado, algo parecido a esto...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $in (@{$var1{Filters}{in}}){
   #tomamos nuestro dato...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo hice en el momento, es solo un borrador, pero seguro que servirá para darte una idea...

Espero que te sirva

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor explorer » 2007-04-18 19:02 @834

Ese 'XML' parece el resultado de un Data::Dumper...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-04-18 19:08 @839

Creo que falta un '->' en '$filterEntry{FilterList}'.

$filterEntry toma cada uno de los elementos de @filtering, que son hashes anónimos, por lo que $filterEntry los almacenará 'en forma de referencia'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor fgalves » 2007-04-19 01:49 @117

¡Hola Explorer!

En efecto, es el resultado de un Data::Dumper.
Y como muy bien has dicho, son hashes sin "key" que los referencie.

Yo intento obtener cada uno de esos hashes por separado mediante el "foreach" pero lo unico que logro obtener es el array entero.

Dicho de otra forma, después de ejecutar la instrucción siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 foreach my $filterEntry (@filtering) {  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


en $filterEntry vuelvo a tener exactamente el mismo array con dos hashes anónimos (es decir @filtering). Por eso abrí este post, porque ya no sabía qué hacer.
Voy a probar tu propuesta y te tengo al corriente.

¡Como siempre, muchas gracias por la ayuda!
¡Saludos!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2007-04-19 02:12 @133

Hola de nuevo,

He probado lo que me dijiste, pero no parece funcionar.
El problema continúa siendo el mismo que tenía antes:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( defined($ref->{Filters}->{In}) )  {
        my @filtering = $ref->{Filters}->{In};
               
        foreach my $filterEntry (@filtering)
        {

             my @filterList = split (/ /,$filterEntry->{FilterList});
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En $filterEntry, tengo exactamente lo mismo que en @filtering...
Ese es mi gran problema. No consigo aislar los hashes anónimos de ninguna manera.

¿Alguien me puede echar una manita?
¡Muchas gracias!
Saludos,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2007-04-19 09:23 @432

¡Ah, es que el problema es a la hora de inicializar @filtering!

Debería ser:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @filtering = @{$ref->{Filters}->{In}};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tenemos que obligar a leer una lista de valores. Sino, solo estamos leyendo un escalar (la referencia a la estructura).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-04-19 09:30 @438

fgalves escribiste:En efecto, es el resultado de un Data::Dumper.
Es que hay formas mucho mejores para que dos programas compartan una estructura de datos, como puede ser el uso del módulo Storable o el DBM::Deep. De hecho, yo estoy usando DBM::Deep ahora mismo en el trabajo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor fgalves » 2007-04-20 03:46 @198

Hola Explorer!!
Muchisimas gracias!! Ahora funciona perfectamente!!!
Saludos!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621


Volver a Básico

¿Quién está conectado?

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