PDA

Ver la Versión Completa : No aparece la leyenda encoding="UTF-8" en la cabecera de XML


Alexis De la Cr
04-07-2014, 01:06:22
Estimados amigos de Club Delphi

Les comento el siguiente problema que tengo. Tengo una Aplicación que genera CFDI desarrollada en delphi 2007 y la cual funciona correctamente en todas sus etapas. Sin embargo, por necesidades ajenas a mi, estoy migrando el codigo a Delphi XE2, y aqui vienen los problemas, los cuales he podido ir solucionando, pero hay uno que no hallo como, y esta relacionado con la generacion del archivo xml. Resulta que a la hora de Escribir el Archivo XML, no guarda la leyenda encoding="UTF-8" y aparece asi

<?xml version="1.0"?>

cuando deberia aparecer de la siguiente forma

<?xml version="1.0" encoding="UTF-8"?>

Entiendo que a partir de la Version 2009 ha habido cambios, sobre todo con la introduccion del unicode y pienso que debe ir por esta direccion el problema. El codigo que utilizo es el siguiente

xmlDoc := TXMLDocument.Create(nil);
xmlDoc.Active := True;
xmlDoc.Version:='1.0';
xmlDoc.Encoding:='UTF-8';
iNode := xmlDoc.AddChild('cfdi:Comprobante') ;
iNode.DeclareNamespace('cfdi','http://www.sat.gob.mx/cfd/3');
.
.
.
xmlDoc.XML.SaveToFile('c:\temporal.xml');
xmlDoc.Active:=False;
xmlDoc:=nil;


Alguna Sugerencia? Muchas Gracias por su ayuda

Alexis De la Cr
04-07-2014, 02:27:43
Acab de hacer una prueba de validación en el portal del SAT de un archivo xml generado con la version delphi 2007 y el resultado es el siguiente


Versión del estándar: 3.2

Codificación
Comprobante expresado en UTF-8

Validación de estructura: Válido

Cadena original del CFDI:
.
.
.
.

Digestión SHA-1 de cadena original expresada en hexadecimal
d5bbf2489a69c437323c613f6544183b6b709319

Certificado usado : 00001000000301042574
Certificado reportado : 00001000000301042574

El sello del CFDI es válido

Cadena original del Complemento de Certificación:
.
.
.

Digestión SHA-1 de cadena original del complemento de certificación expresada en hexadecimal
76a5b097d0eda41e2ee501100f780018a68c41a0

Certificado usado : borrado
Certificado reportado : borrado

El sello de certificación no es válido


IMPORTANTE: Los resultados anteriores se presentan a efecto de que valide
la estructura, cadena original y sello de su CFDI. Para que una factura
electrónica sea válida para efectos fiscales, deberá reunir los requisitos que
establecen las disposiciones fiscales vigentes.


y ahora l que me dice con un archivo xml generado con Delphi XE2 usando la misma rutina


Versión del estándar: 3.2

Codificación
Comprobante expresado en ANSI

Validación de estructura: Inválido

Se presentaron errores al leer el comprobante:temporal.xml
Error: Invalid byte 2 of 3-byte UTF-8 sequence.

IMPORTANTE: Los resultados anteriores se presentan a efecto de que valide
la estructura, cadena original y sello de su CFDI. Para que una factura
electrónica sea válida para efectos fiscales, deberá reunir los requisitos que
establecen las disposiciones fiscales vigentes.


Alguna Opinion? Gracias

Al González
04-07-2014, 06:27:22
Hola Alexis.

Me tomé un pequeño espacio para hacer una prueba de lo que comentas tanto en Delphi 2007 como en XE2 (aplicación Win32), y en ambos casos generó el XML con la cabecera correcta:

<?xml version="1.0" encoding="UTF-8"?>

Debe haber algo que estés haciendo de forma distinta en XE2 para que el resultado sea el que mencionas. ¿Podrías facilitarnos más detalles?

Alexis De la Cr
04-07-2014, 16:55:31
Estimado Al Gonzalez, pues te agradezco el hecho de que te hayas tomado el tiempo para responder. Te comento que ya resolví esa parte. Comencé haciendo la prueba de agregarle manualmente la leyenda faltante al encabezado con un editor de texto, sin embargo cuando intentaba abrirlo con el internet explorer para verificarlo, me marcaba el error de que había un carácter inválido, y por lo tanto no lo desplegaba, así que no era solo de que faltaba la leyenda. El problema estaba en la codificación del Archivo, que al no estar codificado en UTF8, pues obviamente no mostraba la susodicha leyenda.

el código ya solucionado es el siguiente:


xmlDoc.XML.SaveToFile('c:\temporal.xml', TEncoding.UTF8);


y listo, asunto arreglado.

Ahora tengo otros problemas, especificamente con el TSringStream y el famosisimo unicode, pero eso ya es harian de otro costal.

Gracias Al