Error tratamiento ficheros XML con XML::Simple->XMLin
![Nota Nota](https://perlenespanol.com/foro/styles/prosilver/imageset/icon_post_target.gif)
Hola,
es la primera vez que publico un mensaje en el foro y quería felicitaros por la ayuda que prestáis a la gente.
Os comento el problema que tengo: me envían unos ficheros XML que, teóricamente, están en formato utf-8; cuando intento pasar el método XMLin del módulo XML::Simple y detecta acentos o caracteres raros el script me retorna error:
Os pongo un ejemplo:
He intentado diferentes formas para tratar la información pero no me funciona ninguna de ellas, os detallo:
1.
Resultado :
print() del valor por terminal :
2. He intentado también abrirlo en utf y convertirlo a iso, pero tampoco
3. Además he intentado utilizar los métodos del modulo Encode:
y
y tampoco me funciona.
Para intentar salir del paso y leyendo en el foro otro mensaje, me he creado una función para tratar la información, pero no es viable ya que no puedo modificar la información original del fichero:
Os agradecería me echarais un cable.
Gracias de antemano, un saludo.
es la primera vez que publico un mensaje en el foro y quería felicitaros por la ayuda que prestáis a la gente.
Os comento el problema que tengo: me envían unos ficheros XML que, teóricamente, están en formato utf-8; cuando intento pasar el método XMLin del módulo XML::Simple y detecta acentos o caracteres raros el script me retorna error:
Using text Syntax Highlighting
not well-formed (invalid token) at line 31, column 89, byte 1946 at D:/Perl/site/lib/XML/Parser.pm line 187
...caught
...caught
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Os pongo un ejemplo:
Using xml Syntax Highlighting
<campo nombre="DESCRIPCION_LARGA">19/11/2009 - 14:22:45 - Rubén Doblado Lopezdesc</campo>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
He intentado diferentes formas para tratar la información pero no me funciona ninguna de ellas, os detallo:
1.
Using perl Syntax Highlighting
- use XML::Simple;
- use Data::Dumper;
- use Encode;
- $codificacion = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
- $sNameFileOri = "D:/mensaje1258646652402.xml";
- $sNameFileDes = "D:/mensaje1258646652402_new.xml";
- $datos = $codificacion ."\n";
- open IN, $sNameFileOri ;
- while ( <IN> )
- {
- $datos .= $_;
- }
- $data = decode("utf-8", $datos);
- close IN;
- open OUT, "> $sNameFileDes" ;
- print OUT $data;
- close OUT;
- # create object
- my $xml = new XML::Simple;
- # read XML file
- my $data = $xml->XMLin($sNameFileDes);
- print "=======================================================\n";
- print Dumper($data);
- print "=======================================================\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Resultado :
Using text Syntax Highlighting
{
'content' => "19/11/2009 - 14:22:45 - Rub\x{fffd}n Doblado Lopezdesc",
'nombre' => 'DESCRIPCION_LARGA'
},
'content' => "19/11/2009 - 14:22:45 - Rub\x{fffd}n Doblado Lopezdesc",
'nombre' => 'DESCRIPCION_LARGA'
},
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
print() del valor por terminal :
Using text Syntax Highlighting
nombre : data->solicitud->campo->DESCRIPCION_LARGA
content : data->solicitud->campo->19/11/2009 - 14:22:45 - Rub�n Doblado Lopezdesc
content : data->solicitud->campo->19/11/2009 - 14:22:45 - Rub�n Doblado Lopezdesc
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
2. He intentado también abrirlo en utf y convertirlo a iso, pero tampoco
Using perl Syntax Highlighting
use open IN => ":utf8", OUT => ":encoding(iso-8859-15)";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
3. Además he intentado utilizar los métodos del modulo Encode:
Using perl Syntax Highlighting
from_to($datos, "iso-8859-1", "utf-8"); # from latin-1 to utf-8
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y
Using perl Syntax Highlighting
$octets = encode_utf8($datos);
$string = decode_utf8($octets);
$string = decode_utf8($octets);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y tampoco me funciona.
Para intentar salir del paso y leyendo en el foro otro mensaje, me he creado una función para tratar la información, pero no es viable ya que no puedo modificar la información original del fichero:
Using perl Syntax Highlighting
sub xml_parser_file
{
$sNameFile = shift;
my $linea = '';
my $datos = '';
open IN, $sNameFile ;
while ( <IN> )
{
$linea = $_;
if ( $linea =~ /á|é|í|ó|ú|Á|É|Í|Ó|Ú|ñ|Ñ|«|»/ )
{
$linea =~ tr/áéíóúÁÉÍÓÚñÑ«»/aeiouAEIOUnN""/;
}
$datos .= $linea;
}
close IN;
open OUT, "> $sNameFile" ;
print OUT $datos;
close OUT;
return ( $defOK );
}
{
$sNameFile = shift;
my $linea = '';
my $datos = '';
open IN, $sNameFile ;
while ( <IN> )
{
$linea = $_;
if ( $linea =~ /á|é|í|ó|ú|Á|É|Í|Ó|Ú|ñ|Ñ|«|»/ )
{
$linea =~ tr/áéíóúÁÉÍÓÚñÑ«»/aeiouAEIOUnN""/;
}
$datos .= $linea;
}
close IN;
open OUT, "> $sNameFile" ;
print OUT $datos;
close OUT;
return ( $defOK );
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Os agradecería me echarais un cable.
Gracias de antemano, un saludo.