• Publicidad

Problema con generación de XML

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

Problema con generación de XML

Notapor fgalves » 2007-01-10 05:34 @274

Hola a todos,

Estoy intentando generar un fichero XML dinámicamente con el aspecto siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<ProjFields>

<ProjField Label="Pepe" Format="%s">
  <StatField Family="fam1" Field="Field1" />
</ProjField>

<ProjField Label="Jose" Format="%s">
  <StatField Family="fam2" Field="Field2" />
</ProjField>
...


</ProjFields>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4




Lo que llevo hecho hasta ahora:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $selectedField;
   
    foreach $selectedField (keys %availableFields) {
               
        push @{$tempXML->{ProjFields}->{ProjField}},{
            Label => $availableFields{$selectedField}->[2],
            Format => $availableFields{$selectedField}->[3]
            };

        push @{$tempXML->{ProjFields}->{ProjField}->{StatField}},{
            Family => $availableFields{$selectedField}->[1],
            Field => $availableFields{$selectedField}->[0]
            };    
    }
    my $exploitableXML = XMLout($tempXML,RootName=> "Projection");        
    print Dumper($exploitableXML);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Como resultado del Dump, me da el siguiente error:
Código: Seleccionar todo
Pseudo-hashes are deprecated at FqStatsMQRMerge.pl line 395.
No such pseudo-hash field "StatField" at FqStatsMQRMerge.pl line 395.


Es decir, el segundo push provoca problemas...
¿Alguien me puede echar una mano?

¡¡¡Muchas gracias!!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor explorer » 2007-01-10 13:35 @607

El problema es que en el primer push estás diciendo que ProjField guarda un hash anónimo (Label y Format), pero en el siguiente push dices ahora que ProjField realmente guarda un hash anónimo con una clave llamada StatField que guarda otro hash anónimo.

Aunque es lícito, no obtendríamos el resultado. También sería lícito hacer push dentro de elementos que sabemos que son arrays, pero en tu estructura, el único array que hay es el del ProjFields.

Lo que realmente necesitas es recrear la estructura en un sólo push, ya que vas a crear un registro por cada clave de availableFields.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l

use Data::Dumper;
use XML::Simple;

my $selectedField;
my %availableFields = (
    Uno => [ qw(Field1 fam1 %s Pepe) ],
    Dos => [ qw(Field2 fam2 %s Jose) ],
);

foreach $selectedField (keys %availableFields) {
    push @{$tempXML->{ProjFields}->{ProjField}},{
        Label     => $availableFields{$selectedField}->[2],
        Format    => $availableFields{$selectedField}->[3],
        StatField => {
                        Family => $availableFields{$selectedField}->[1],
                        Field  => $availableFields{$selectedField}->[0],
        },
    };
}

my $exploitableXML = XMLout($tempXML,RootName=> "Projection");

print Dumper $tempXML;
print "=" x 50;
print $exploitableXML;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Código: Seleccionar todo
$VAR1 = {
          'ProjFields' => {
                            'ProjField' => [
                                             {
                                               'StatField' => {
                                                                'Field' => 'Field2',
                                                                'Family' => 'fam2'
                                                              },
                                               'Label' => '%s',
                                               'Format' => 'Jose'
                                             },
                                             {
                                               'StatField' => {
                                                                'Field' => 'Field1',
                                                                'Family' => 'fam1'
                                                              },
                                               'Label' => '%s',
                                               'Format' => 'Pepe'
                                             }
                                           ]
                          }
        };

==================================================
<Projection>
  <ProjFields>
    <ProjField Format="Jose" Label="%s">
      <StatField Family="fam2" Field="Field2" />
    </ProjField>
    <ProjField Format="Pepe" Label="%s">
      <StatField Family="fam1" Field="Field1" />
    </ProjField>
  </ProjFields>
</Projection>
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


Volver a Básico

¿Quién está conectado?

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