Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Crear Archivo XML

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Sab Oct 21, 2006 10:56 am
g013m
Perlero Nuevo
Perlero Nuevo
Registrado: 15 Jul 2005
Mensajes: 15
Crear Archivo XML Responder citando

Saludos, estoy tratando de crear una archivo XML con el módulo XML::Simple que tenga más o menos la siguiente estructura:
HTML:
<ajaxresponse>
  <item>
    <apellido>xxx</apellido>
    <nombre>zzz</nombre>
    <numero>1</numero>
  </item>
  <item>
    <apellido>xxx</apellido>
    <nombre>zzz</nombre>
    <numero>2</numero>
  </item>
  <item>
    <apellido>xxx</apellido>
    <nombre>zzz</nombre>
    <numero>3</numero>
  </item>
</ajaxresponse>


Esto lo puedo obtener haciendo esto:

Perl:
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);


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):

Perl:

my @numeros = ('1'..'3');
my @otroxml;
foreach(@numeros) {
        push @otroxml, {
                        'item' => [{
                             numero =>$_,
                                nombre => 'zzz',
                                apellido => 'xxx'
                                }]
                }
       
}
my $xml2 = XMLout(\@otroxml,RootName=> "ajaxresponse",NoAttr => 1, );


Si imprimo $xml2, obtengo esto:

HTML:
<ajaxresponse>
  <anon>
    <item>
      <apellido>xxx</apellido>
      <nombre>zzz</nombre>
      <numero>1</numero>
    </item>
  </anon>
  <anon>
    <item>
      <apellido>xxx</apellido>
      <nombre>zzz</nombre>
      <numero>2</numero>
    </item>
  </anon>
  <anon>
    <item>
      <apellido>xxx</apellido>
      <nombre>zzz</nombre>
      <numero>3</numero>
    </item>
  </anon>
</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:
Perl:
$VAR1 = {
          'item' => [
                      {
                        'numero' => '1',
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      },
                      {
                        'numero' => '2',
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      },
                      {
                        'numero' => '3',
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      }
                    ]
        }
;
y para @otroxml:
Perl:
$VAR1 = {
          'item' => [
                      {
                        'numero' => 1,
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      }
                    ]
        };
$VAR2 = {
          'item' => [
                      {
                        'numero' => 2,
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      }
                    ]
        };
$VAR3 = {
          'item' => [
                      {
                        'numero' => 3,
                        'apellido' => 'xxx',
                        'nombre' => 'zzz'
                      }
                    ]
        };


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 Wink
Mensaje Sab Oct 21, 2006 11:59 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
Responder citando

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:

Perl:
my @numeros = ( 1..3 );
my $otroxml;
foreach ( @numeros ) {
    push @{$otroxml->{item}}, {
                numero   => $_,
                nombre   => 'zzz',
                apellido => 'xxx'
    }
}

my $xml2 = XMLout($otroxml,RootName=> "ajaxresponse",NoAttr => 1, );


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.
Mensaje Sab Oct 21, 2006 3:41 pm
g013m
Perlero Nuevo
Perlero Nuevo
Registrado: 15 Jul 2005
Mensajes: 15
Responder citando

Buenisimo, ya funciona bien, muchas gracias.
Saludos.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group