Antes de nada, te pido por favor que edites tus mensajes para poner marcas al código Perl, al XML y a las salidas. Es muy difícil leer tus mensajes si todo va en texto plano.
Si usamos XML::Simple con el XML que nos indicas, sale una estructura muy sencilla:
Using perl Syntax Highlighting
#!/usr/bin/perl
use v5.14;
use XML::Simple;
my $xml_ref = XMLin('kk.xml', KeepRoot => 1);
use Data::Dumper;
say Dumper $xml_ref;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
La salida es:
Using text Syntax Highlighting
$VAR1 = {
'S:Envelope' => {
'xmlns:S' => 'http://schemas.xmlsoap.org/soap/envelope/',
'S:Body' => {
'ns4:SinteIED' => {
'xmlns:ns3' => 'http://ws.iid.sd.eedt.cl/SinteIED/Consultar',
'xmlns:ns2' => 'http://ws.iid.sd.eedt.cl/SinteIED/MovimientosCliente',
'MovimientosCliente' => {
'Movimiento' => {
'DETALLE' => {
'LINEA' => '1',
'PROD' => 'SHAMPOO'
},
'PAIS_CODIGO' => '522',
'MONTO' => '150',
'GUIAS' => {
'LUGAR' => 'CLAVE',
'FECHA' => '2016-12-02',
'NRO' => '3344'
},
'NOMBRE' => 'ALTIMAS'
}
},
'xmlns:ns4' => 'http://ws.iid.sd.eedt.cl/SinteIED'
}
}
}
};
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
así que es muy fácil acceder a lo que quieres. Solo hay que hacer el camino de desreferencia de la estructura que estamos recorriendo:
Using perl Syntax Highlighting
say $xml_ref->{'S:Envelope'}->{'S:Body'}->{'ns4:SinteIED'}->{'MovimientosCliente'}->{'Movimiento'}->{'GUIAS'}->{'FECHA'}; # 2016-12-02
say $xml_ref->{'S:Envelope'}->{'S:Body'}->{'ns4:SinteIED'}->{'MovimientosCliente'}->{'Movimiento'}->{'DETALLE'}->{'PROD'}; # SHAMPOO
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Naturalmente, es un fastidio tener que escribir todo eso. Incluso haciéndolo con la forma abreviada:
Using perl Syntax Highlighting
say $xml_ref->{'S:Envelope'}{'S:Body'}{'ns4:SinteIED'}{'MovimientosCliente'}{'Movimiento'}{'GUIAS'}{'FECHA'}; # 2016-12-02
say $xml_ref->{'S:Envelope'}{'S:Body'}{'ns4:SinteIED'}{'MovimientosCliente'}{'Movimiento'}{'DETALLE'}{'PROD'}; # SHAMPOO
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Una forma de abreviarlo es teniendo una referencia a la estructura de datos que realmente nos interesa:
Using perl Syntax Highlighting
my $movimiento_ref = $xml_ref->{'S:Envelope'}->{'S:Body'}->{'ns4:SinteIED'}->{'MovimientosCliente'}->{'Movimiento'};
say $movimiento_ref->{'GUIAS'}->{'NRO'}; # 3344
say $movimiento_ref->{'NOMBRE'}; # ALTIMAS
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Pero todo esto funciona solamente si la estructura del XML es exactamente como lo has indicado. Si, por ejemplo, hubiera más registros de Movimientos, vendría en forma de array:
Using text Syntax Highlighting
'MovimientosCliente' => {
'Movimiento' => [
{
'GUIAS' => {
'FECHA' => '2016-1
'LUGAR' => 'CLAVE'
'NRO' => '3344'
},
'MONTO' => '150',
'PAIS_CODIGO' => '522',
'DETALLE' => {
'PROD' => 'SHAMP
'LINEA' => '1'
},
'NOMBRE' => 'ALTIMAS1'
},
{
'GUIAS' => {
'FECHA' => '2016-1
'NRO' => '3344',
'LUGAR' => 'CLAVE'
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Así que no nos vale el programa tal y como lo tenemos porque no contemplamos la posibilidad de que hubiera un array.
Tenemos, entonces, que decirle a XML::Simple qué estructuras queremos que se presenten siempre en forma de array:
Using perl Syntax Highlighting
my $xml_ref = XMLin('kk.xml', KeepRoot => 1, ForceArray => ['Movimiento']);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ahora ya sí podemos acceder a ese array, sin importar que el XML original tuviese uno o más elementos:
Using perl Syntax Highlighting
my $movimientos_ref = $xml_ref->{'S:Envelope'}{'S:Body'}{'ns4:SinteIED'}{'MovimientosCliente'}{'Movimiento'};
for my $mov_ref (@$movimientos_ref) {
say $mov_ref->{'DETALLE'}{'PROD'}; # SHAMPOO,...
say $mov_ref->{'GUIAS'}->{'NRO'}; # 3344,...
say $mov_ref->{'NOMBRE'}; # ALTIMAS1, ALTIMA2...
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4