Precisamente las marcas TEXTO están mal... a las marcas de final les falta el carácter '/'.
Y otro detalle: lo que contienen las marcas TEXT3 no es del todo consistente, pues contienen marcas distintas. En solo uno de ellos está la marca INFO, así que hay que tener en cuenta un caso.
He reeditado tu mensaje y he corregido el sangrado de las marcas y los caracteres que faltaban.
El siguiente ejemplo te servirá para ver cómo acceder al interior de la estructura.
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
use XML::Simple;
my $xml_simple = new XML::Simple( KeyAttr => [] );
my $xml = $xml_simple->XMLin(
'<?xml version="1.0"?>
<ScanFULL>
<Scan>
<Name><![CDATA[b ( 10.10.10.15 )]]></Name>
<INITURL><![CDATA[10.10.10.15]]></INITURL>
<WEBS StartUrl="http://10.10.10.15/">
<TEST2>
<TEST3 id="1">
<Name></Name>
<TODASLASURL>http://10.10.10.15/</TODASLASURL>
</TEST3>
<TEST3 id="2">
<Name>index.html</Name>
<TODASLASURL>http://10.10.10.15/index.html</TODASLASURL>
<INFO>
<INFORMA>
<TEXTO>hola</TEXTO>
</INFORMA>
<INFORMA>
<TEXTO>hola2</TEXTO>
</INFORMA>
<INFORMA>
<TEXTO>hola3</TEXTO>
</INFORMA>
</INFO>
</TEST3>
</TEST2>
</WEBS>
</Scan>
</ScanFULL>
');
use Data::Dumper;
print Dumper $xml; # Volcado de la estructura creada
my $test3_ref = $xml->{Scan}->{WEBS}->{TEST2}->{TEST3}; # Acceso directo al array de TEST3
for my $test3 (@$test3_ref) { # Recorremos todos los elementos de TEST3
if (exists $test3->{INFO}) { # Si en ese elemento existe un INFO
my $textos_ref = $test3->{INFO}->{INFORMA}; # accedemos al array de INFORMA
for my $textos (@$textos_ref) { # Recorremos todos los elementos INFORMA
say $textos->{TEXTO}; # y sacamos los TEXTOs
}
}
}
__END__
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esto es lo que sale:
Using text Syntax Highlighting
$VAR1 = {
'Scan' => {
'INITURL' => '10.10.10.15',
'WEBS' => {
'StartUrl' => 'http://10.10.10.15/',
'TEST2' => {
'TEST3' => [
{
'TODASLASURL' => 'http://10.10.10.15/',
'id' => '1',
'Name' => {}
},
{
'INFO' => {
'INFORMA' => [
{
'TEXTO' => 'hola'
},
{
'TEXTO' => 'hola2'
},
{
'TEXTO' => 'hola3'
}
]
},
'TODASLASURL' => 'http://10.10.10.15/index.html',
'id' => '2',
'Name' => 'index.html'
}
]
}
},
'Name' => 'b ( 10.10.10.15 )'
}
};
hola
hola2
hola3
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Como ves, el Data::Dumper es muy útil para mostrar la estructura que estamos manejando.
El programa accede a la estructura, según cómo sean los elementos que se va encontrando. En algunas ocasiones es un acceso directo, pero en otras, tiene que ver si existe o no INFO, y en otras, acceder como un
array, por ser un conjunto de elementos.
Al final, salen los contendidos de los <TEXTOS>.