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)};