• Publicidad

Leer XML y guardar datos en campo tipo blob

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Leer XML y guardar datos en campo tipo blob

Notapor sarriaga » 2015-06-24 12:09 @548

Hola, compañeros Perleros, nuevamente molestando, :lol:

Quiero pedir su ayuda ya que no he podido dar con la solución. Les platico un poco la problemática: Tengo una interfaz donde cargo un archivo XML y lo valido, y después lo guardo en una tabla en una base de datos Firebird. Todo lo guarda correctamente menos el xml completo.

El problema es que no sé si no estoy leyendo correctamente el xml, porque puedo acceder correctamente a sus datos pero al insertar en la base de datos me deja vacío el campo, como si no existieran datos o no lo leyera correctamente.

Necesito ayudaaaaaa :(

Les comparto algo de mi código que estoy utilizando. Espero alguien pueda ayudarme u orientarme.

Saludos

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. our ($SCHEMA, $XML_TEMP) = ('./cfdi.xsd', './temp.xml');
  2.  
  3.  
  4. sub guardar_xml{
  5. my ($self, $xml_fh) = @_; #recibo el xml del navegador
  6. my ($RFC, $schema, $xml_info, $xml) = ('ASSE8901T20'); #declaro variables que necesito y #asigno un valor al RFC
  7.  
  8. my $xml_data = &$retrieveFile($xml_fh);
  9.  
  10. my $fh = IO::File->new('temp.xml', '>');print $fh $xml_data if defined $fh;$fh->close;
  11.   eval{$schema = XML::LibXML::Schema->new(location => $SCHEMA)};
  12.   return 'Error al cargar SCHEMA XML: '.$@ if $@;
  13.   eval {$schema->validate(XML::LibXML->new->parse_file($XML_TEMP))};
  14.   return 'El documento XML no es válido: '.$@ if $@;
  15.   eval {$xml_info = XML::Simple->new->XMLin($xml_data)};
  16.  
  17. my $fecha = $xml_info->{fecha};
  18. $fecha =~ /^(\d{4})\-(\d{2})\-(\d{2})\w(\d{2})\:(\d{2})\:(\d{2})$/;
  19. my $fechaInfo = "$1$2$3$4$5$6";
  20.  
  21. &$connect($self->db_file)->do("INSERT INTO CFDI_REPOSITORIO VALUES(GEN_ID(ID_CFDI,1), '$RFC', '$xml_info->{'cfdi:Emisor'}->{rfc}', '$xml_info->{serie}', $xml_info->{total}, '".$xml_data."', $fechaInfo)");
  22.  
  23. }
  24.  
  25. ###subrutinas
  26. {
  27. $retrieveFile = sub{
  28.     my $fh = shift;
  29.     if(defined $fh && ref $fh eq 'IO::Handle'){
  30.       if($fh->opened){
  31.         my ($bytes_total, $data) = (0);
  32.         while((my $bytes_read = $fh->sysread($data, 1024, $bytes_total)) && $bytes_total <= $BYTES_MAX){
  33.           $bytes_total += $bytes_read;
  34.         }
  35.         $fh->close;
  36.         return $data;
  37.       }else{
  38.         return 'The IO::Handle is not opened'
  39.       }
  40.     }else{
  41.       return 'IO::Handle expected'
  42.     }
  43.   };
  44. }
  45.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Publicidad

Re: Leer XML y guardar datos en campo tipo blob

Notapor explorer » 2015-06-24 14:53 @662

Es muy posible que alguno de los contenidos del XML afecten a la consulta. O alguna de las comillas simples alrededor del tercer argumento a INSERT estén mal puestas.

Lo recomendable sería usar el modo de paso de parámetros, para que, en caso de que existan caracteres extraños o peligrosos, sean escapados.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $sth = $dbh->prepare('INSERT INTO CFDI_REPOSITORIO VALUES(GEN_ID(ID_CFDI,1),
  2.                ?,    ?,                                 ?,                    ?,                  ?,         ?          )');
  3. $sth->execute( $RFC, $xml_info->{'cfdi:Emisor'}->{rfc}, $xml_info->{'serie'}, $xml_info->{total}, $xml_data, $fechaInfo );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Más información en DBI, en la sección Placeholders and Bind Values.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Leer XML y guardar datos en campo tipo blob

Notapor sarriaga » 2015-06-24 15:06 @671

De acuerdo, voy a revisar la sentencia, pero... ¿por qué cuando hago el return Dumper de $xml_info (que proviene de $xml_data) viene vacío pero si accedo a él como '$xml_info->{'cfdi:Emisor'}->{rfc}' sí contiene información?
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Leer XML y guardar datos en campo tipo blob

Notapor explorer » 2015-06-26 05:58 @290

Pues... no lo sé. Si $xml_info contuviese algo, el Dumper lo sacaría.

Lo que sí es cierto es que

'$xml_info->{'cfdi:Emisor'}->{rfc}'

está mal escrito (hay exceso de comillas simples), por lo que seguro que da problemas. De hecho, lo que has escrito se compone de tres cadenas de caracteres:

$xml_info->{
cfdi:Emisor
}->{rfc}

Quizás por eso sí que obtienes una respuesta, aunque $xml_info no contenga nada.

El uso de 'use strict;' y 'use warnings;' es muy recomendado para detectar estos casos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Leer XML y guardar datos en campo tipo blob

Notapor sarriaga » 2015-07-07 10:47 @491

Cierto, tenía que ver con las comillas.

Ahora tengo un problema, ya que cuando inserto en la base de datos algunos campos que deberían llevar acento los pone con signos. La codificación de todos los XML es UTF-8. Cabe mencionar que si abro directamente el XML me muestra las palabras con acentos correctamente, pero al momento de insertarlo en la base de datos, lo cambia a signos.

¿Es posible que el sysread() no lo esté leyendo correctamente? O ¿en qué parte de mi código no convierte los acentos?

Saludos
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Leer XML y guardar datos en campo tipo blob

Notapor explorer » 2015-07-07 11:11 @508

Nos falta por saber un dato... ¿en qué codificación está trabajando la base de datos?

Normalmente, si son campos de tipo BLOB, no será necesaria ninguna transformación, ya que guardará los datos de forma literal.

Si a Perl no se le dice nada, creerá que lo que está leyendo es una ristra de bytes codificada en ISO-8859-1 (latin1). Si esa misma ristra la sacamos por pantalla, y resulta que la codificación en la que está trabajando la terminal es la misma en la que están codificados los datos, nos parecerá que todo está bien.

Por ejemplo, si leemos un XML codificado en UTF-8, y sacamos sus contenidos por la terminal, que también está trabajando en UTF-8, veremos que salen bien los caracteres tildados, porque Perl saca la ristra de bytes de forma literal, y es interpretada por la terminal.

O incluso el mismo acto de leer del XML. Si el módulo está bien hecho, se habrá dado cuenta de que el XML está codificado en UTF-8, por lo que a Perl le devolverá el contenido en UTF-8... y entonces el problema lo tendremos a la salida. Perl, por defecto, guarda los caracteres o bien como una ristra de bytes o bien como una serie de caracteres en Unicode (no confundir con UTF-8). Si no le decimos nada de cómo tiene que hacer la salida de datos, Perl trabajará en ISO-8859-1, y si se encuentra que lo que tiene que sacar está en Unicode, pues ahí hará una transformación de Unicode a ISO-8859-1.

Lo primero que veo del código, que se puede intentar, es llamar a binmode() para indicarle a Perl que no debe hacer ninguna interpretación de los caracteres que esté leyendo. Vamos, que queremos una simple ristra de bytes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Leer XML y guardar datos en campo tipo blob

Notapor sarriaga » 2015-08-06 10:55 @496

¡Listo! ¡Decodifica de acuerdo a si es UTF-8 o ISO-8859-1! Muchas gracias :D
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado