Tema: xml a txt
Ver Mensaje Individual
  #14 (permalink)  
Antiguo 26/07/2007, 15:08
jferrero
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 525
Antigüedad: 18 años, 10 meses
Puntos: 11
Re: xml a txt

Con el programa
Código:
#!/usr/bin/perl
use XML::Simple;
use strict;
use warnings;

my $xml = XMLin('kk.xml', ForceArray => [ 'Archivo' ]);

foreach my $archivo ( @{ $xml->{Archivo} } ) {

    print
        join q{;},
            $archivo->{CodigoEstado}    ,
            $archivo->{Nombre}          ,
            $archivo->{Concesionaria}   ,
            $archivo->{Observaciones}   ,
            $archivo->{FechaProceso}    ,
    ;

    print "\n";
}
y el fichero de entrada kk.xml:
Código:
<?xml version="1.0" encoding="UTF-8"?>
<Salida>
  <Archivo>
          <CodigoEstado>6</CodigoEstado>
          <Nombre>ingreso_0302320001_20070518.xml</Nombre>
          <Concesionaria>3</Concesionaria>
          <Observaciones> [Firmado]</Observaciones>
          <FechaProceso>12/06/2007 03:01</FechaProceso>
  </Archivo>
  <Archivo>
          <CodigoEstado>7</CodigoEstado>
          <Nombre>ingreso_0302320001_20070518.xml</Nombre>
          <Concesionaria>4</Concesionaria>
          <Observaciones> [Firmado]</Observaciones>
          <FechaProceso>13/06/2007 03:01</FechaProceso>
  </Archivo>
</Salida>
hace la salida:
Código:
6;ingreso_0302320001_20070518.xml;3; [Firmado];12/06/2007 03:01
7;ingreso_0302320001_20070518.xml;4; [Firmado];13/06/2007 03:01
El problema de XML::Simple es que es tan simple que hay que manejarse muy bien con las estructuras de datos en Perl. El uso del módulo Data::Dumper es casi imprescindible, en estos casos, para saber qué es lo que estamos leyendo.
Otra forma de hacer el programa:
Código:
#!/usr/bin/perl
use strict;
use warnings;

use XML::Simple;

my $xml = XMLin('kk.xml', ForceArray => [ 'Archivo' ]);

my $numero_de_archivos = @{ $xml->{Archivo} };

for ( my $i = 0; $i < $numero_de_archivos; $i++ ) {

    print
        join q{;},
            $xml->{Archivo}->[$i]->{CodigoEstado}    ,
            $xml->{Archivo}->[$i]->{Nombre}          ,
            $xml->{Archivo}->[$i]->{Concesionaria}   ,
            $xml->{Archivo}->[$i]->{Observaciones}   ,
            $xml->{Archivo}->[$i]->{FechaProceso}    ,
    ;

    print "\n";
}
Otra forma, más oscura, de hacer el print principal más corto, es usando un "hash slice":
Código:
print
    join ";",
        @{$xml->{Archivo}->[$i]}
            {qw(CodigoEstado Nombre Concesionaria Observaciones FechaProceso)};

Última edición por jferrero; 26/07/2007 a las 15:19