• Publicidad

Crear Archivo XML

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Crear Archivo XML

Notapor g013m » 2006-10-21 11:56 @538

Saludos, estoy tratando de crear una archivo XML con el módulo XML::Simple que tenga más o menos la siguiente estructura:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <ajaxresponse> 
  2. <item> 
  3. <apellido>xxx</apellido> 
  4. <nombre>zzz</nombre> 
  5. <numero>1</numero> 
  6. </item> 
  7. <item> 
  8. <apellido>xxx</apellido> 
  9. <nombre>zzz</nombre> 
  10. <numero>2</numero> 
  11. </item> 
  12. <item> 
  13. <apellido>xxx</apellido> 
  14. <nombre>zzz</nombre> 
  15. <numero>3</numero> 
  16. </item> 
  17. </ajaxresponse> 


Esto lo puedo obtener haciendo esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $lista = {
        'item' => [
          {
            'numero' => '1',
            'nombre'    => 'zzz',
            'apellido'   => 'xxx'
          },
                  {
            'numero' => '2',
            'nombre'    => 'zzz',
            'apellido'   => 'xxx'
          },
                  {
            'numero' => '3',
            'nombre'    => 'zzz',
            'apellido'   => 'xxx'
          }
                ]
        };
my $xml = XMLout($lista,RootName=> "ajaxresponse",NoAttr => 1);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


En $xml tengo todo el XML generado. Ahora, quiero hacer esto mismo pero no escribiendo el array dinámicamente con datos que obtengo de una consulta SQL, estoy haciendo algo parecido a esto (pero con datos reales):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @numeros = ('1'..'3');
my @otroxml;
foreach(@numeros) {
        push @otroxml, {
                        'item' => [{
                                numero =>$_,
                                nombre => 'zzz',
                                apellido => 'xxx'
                                }]
                }
       
}
my $xml2 = XMLout(\@otroxml,RootName=> "ajaxresponse",NoAttr => 1, );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si imprimo $xml2, obtengo esto:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <ajaxresponse> 
  2. <anon> 
  3. <item> 
  4. <apellido>xxx</apellido> 
  5. <nombre>zzz</nombre> 
  6. <numero>1</numero> 
  7. </item> 
  8. </anon> 
  9. <anon> 
  10. <item> 
  11. <apellido>xxx</apellido> 
  12. <nombre>zzz</nombre> 
  13. <numero>2</numero> 
  14. </item> 
  15. </anon> 
  16. <anon> 
  17. <item> 
  18. <apellido>xxx</apellido> 
  19. <nombre>zzz</nombre> 
  20. <numero>3</numero> 
  21. </item> 
  22. </anon> 
  23. </ajaxresponse> 


La cosa es que estan apareciendo esos tags: <anon></anon>, el problema es, según estuve revisando, en la forma como se crea el array, por que si hago un "Dump" de la estructura de los arrays, obtengo esto:

para $lista:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$VAR1 = {
          'item' => [
                      {
                        'numero' => '1',
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      },
                      {
                        'numero' => '2',
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      },
                      {
                        'numero' => '3',
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      }
                    ]
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
;
y para @otroxml:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$VAR1 = {
          'item' => [
                      {
                        'numero' => 1,
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      }
                    ]
        };
$VAR2 = {
          'item' => [
                      {
                        'numero' => 2,
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      }
                    ]
        };
$VAR3 = {
          'item' => [
                      {
                        'numero' => 3,
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      }
                    ]
        };
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


entonces en vez de obtener una sola $VAR obtengo 3, como podría hacer para que el array que necesito quede de la estructura correcta, o como hago para que el módulo XML::Simple pueda formatearlo de la forma correcta, creo que el problema es como estoy construyendo el array, si alguno puede darme una luz, se lo agradecería ;)
Resistirse es inútil, al final todos serán asimilados.
http://g013m.unplug.org.ve
g013m
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2005-07-15 23:11 @007

Publicidad

Notapor explorer » 2006-10-21 12:59 @583

Si, el problema es a la hora de construir la estructura de datos.

Fíjate que primero hablas de $lista (un escalar), pero luego hablas de un array (@otroxml).

En la asignación que haces con push, estas introduciendo efectivamente en elemento de un array, y por eso el Dump te sale cada elemento como una variable distinta.

Se podría crear el xml de la misma manera que tienes definido en $lista: como un escalar que referencia al resto de la estructura:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @numeros = ( 1..3 );
my $otroxml;
foreach ( @numeros ) {
    push @{$otroxml->{item}}, {
                numero   => $_,
                nombre   => 'zzz',
                apellido => 'xxx'
    }
}

my $xml2 = XMLout($otroxml,RootName=> "ajaxresponse",NoAttr => 1, );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Estos son los pasos:
* Creamos la variable $otroxml
* Dentro del bucle, $otroxml->{item} nos 'crea' la misma estructura base de $lista: dentro de $lista sólo hay un hash anónimo que tiene sólo una pareja clave/valor, la de 'item' y todo lo demás.
* Sabemos que el valor almacenado en la clave 'item' es una referencia a un array (o, mejor dicho, en un array anónimo). Poniendo @{$otroxml->{item}} Pel ya sabe que dentro de 'item' hay un array, por lo que ya puede actuar el push.
* Y lo que recibe push es un hash anónimo con nuestros 3 valores.
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 g013m » 2006-10-21 16:41 @737

Buenisimo, ya funciona bien, muchas gracias.
Saludos.
Resistirse es inútil, al final todos serán asimilados.
http://g013m.unplug.org.ve
g013m
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2005-07-15 23:11 @007


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron