Has leído poco...
Cuando no sabemos qué aspecto tiene algo, podemos hacer un volcado para verlo.
Ejemplo. Con el siguiente programa vemos el contenido del xml interpretado por XML::Simple:
Using perl Syntax Highlighting
#!/usr/bin/perl
use v5.14;
use File::Slurp;
use XML::Simple;
my $xmlfile = read_file('code_37483_1.xml');
my $xs = XML::Simple->new();
my $xml = $xs->XMLin( $xmlfile, forcearray => 1 );
use Data::Dumper;
say Dumper $xml;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esta es la salida:
Using xml Syntax Highlighting
$VAR1 = {
'SEC' => [
{
'NONCE' => [
{}
]
}
],
'PAR' => [
{
'SOLICITUD' => [
{
'REPRESENTANTE' => [
{
'DOCUMENTO' => [
{}
],
'NOM_REP' => [
{}
]
}
],
'L_VARIABLES' => [
{
'VARIABLE' => [
{
'CODIGO' => [
{}
],
'ETIQUETA' => [
{}
]
}
]
}
],
'NUM_SOL' => [
'X'
],
'NUM_REG' => [
{}
],
'FECHA_SOL' => [
{}
],
'L_DOC' => [
{
'DOC' => [
{
'EXT' => [
{}
],
'NOM' => [
{}
],
'DAT' => [
{}
]
}
]
}
],
'TITULAR' => [
{
'DOCUMENTO' => [
{}
],
'NOM_TIT' => [
{}
],
'TIPODOCUMENTO' => [
{}
]
}
],
'EJE_SOL' => [
{}
]
}
]
}
],
'RES' => [
{
'CODIGO' => [
{}
],
'EXITO' => [
{}
]
}
]
};
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Vemos que XML::Simple ha generado un
array por cada marca. Eso es debido a la presencia de la opción
ForceArray => 1.
Entonces para acceder a 'NUM_SOL' usaremos algo como esto:
$xml->{PAR}->[0]->{SOLICITUD}->[0]->{NUM_SOL}->[0];Si lo ponemos a 0, sale algo completamente distinto:
Using xml Syntax Highlighting
$VAR1 = {
'SEC' => {
'NONCE' => {}
},
'PAR' => {
'SOLICITUD' => {
'REPRESENTANTE' => {
'DOCUMENTO' => {},
'NOM_REP' => {}
},
'L_VARIABLES' => {
'VARIABLE' => {
'CODIGO' => {},
'ETIQUETA' => {}
}
},
'NUM_SOL' => 'X',
'NUM_REG' => {},
'FECHA_SOL' => {},
'L_DOC' => {
'DOC' => {
'EXT' => {},
'NOM' => {},
'DAT' => {}
}
},
'TITULAR' => {
'DOCUMENTO' => {},
'NOM_TIT' => {},
'TIPODOCUMENTO' => {}
},
'EJE_SOL' => {}
}
},
'RES' => {
'CODIGO' => {},
'EXITO' => {}
}
};
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
con lo que para acceder a 'NUM_SOL' sería
$xml->{PAR}->{SOLICITUD}->{NUM_SOL};lo cual es más sencillo, claro.
Otra cosa... es muy posible que no necesites hacer la traducción a cadena de lo que te devuelve SOAP, y que la respuesta ya sea una estructura jerárquica, con lo que no necesitas XML::Simple, sino acceder a los contenidos de forma directa. Esto es lo que se comenta en el hilo
Cómo leer un SOAP enlazado antes.
Es más... no necesitas nada de esto...
Según la documentación de SOAP::Lite, la respuesta de la ejecución de un método es de tipo
SOAP::SOM. Entonces, tu programa podría quedar reducido a algo como esto (no probado):
Using perl Syntax Highlighting
my $serviceWsdl = "http://192.1.1.1:8080/services/Ws?wsdl";
my $soap = SOAP::Lite->service($serviceWsdl);
my $param = "valores";
my $result = $soap->servicio($param);
my $res = $result->valueof('//PAR/SOLICITUD/NUM_SOL');
print "$res\n";
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4