ECODEX TIENE ESTOS NUEVOS DATOS DE CONTACTO :
Comercializacion y Ventas - Evelia Vicke evicke@ecodex.com.mx 33-16-03-03-48
Soporte - Humberto Guerrero soporte@ecodex.com.mx 33-34-90-46-03
El error que te esta marcando se refiere a que estas declarando nuevamente una variable que ya existe.
Siguiendo el mismo ejemplo:
procedure ConvertBOM(infile, outfile: string);
var
Archivo, ArchivoBOM: file of byte;
s: string ;
c: byte;
h: integer;
begin
assignfile(Archivo, infile); {abrir el XML original}
assignfile(ArchivoBOM, outfile); {escribir un XML nuevo}
reset(Archivo);
rewrite(ArchivoBOM);
c:= 239; write(ArchivoBOM, c); {insertar EF}
c:= 187; write(ArchivoBOM, c); {insertar BB}
c:= 191; write(ArchivoBOM, c); {insertar BF}
while not eof(Archivo) do
begin
read(Archivo, c); {leer archivo original}
s:=s+IntToHex(c, 2)+' ';
write(ArchivoBOM, c); {escribir lo mismo en el nuevo}
end;
closefile(Archivo);
closefile(ArchivoBOM);
end;
pstriegl escribió:En el caso que el SAT insiste de dejarlo asi, no es tan muy dificil de cumplir.
Lo probé con la rutina abajo, que me convierte el XML a otro XML y este si validó perfectamente en el SAT.
Solo Tomo el archivo original como un archivo de bytes (igual el de salida). Antes de escribir los datos del archivo original solo insert el BOM (EF BB BF)
El resto no mas se copea igual (ni si quiera vi lo del DTD, a la mejor el SAT lo pone despues).
procedure Convert$%#$SAT(infile, outfile: string);
var f, outfile: file of byte;
s: string ;
c: byte;
h: integer;
begin
assignfile(f,infile); {abrir el XML original}
assignfile(outfile, outfile); {escribir un XML nuevo}
reset(f);
rewrite(outfile);
c:= 239; write(outfile, c); {insertar EF}
c:= 187; write(outfile, c); {insertar BB}
c:= 191; write(outfile, c); {insertar BF}
while not eof(f) do
begin
read(f,c); {leer archivo original}
s:=s+IntToHex(c, 2)+' ';
write(outfile, c); {escribir lo mismo en el nuevo}
end;
closefile(f);
closefile(outfile);
end;
Buenas tardes a todos, estos cuates del SAT nos traen de cabeza, alguien me podria ayudar a poner el BOM, estoy desarrollando en VB6.
El codigo que tengo es el siguiente:
Private Function CrearDOM() As MSXML2.DOMDocument60
Dim oDOM As New MSXML2.DOMDocument60
Dim Nodo As MSXML2.IXMLDOMNode
Set Nodo = oDOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
oDOM.appendChild Nodo
Set Nodo = Nothing
Set CrearDOM = oDOM
End Function
Intente poner los caracteres al principio del archivo como una cadena, pero me da error
procedure InsertaBOM(const XMLFileName : AnsiString);
const
UTF8BOMString : array[1..3] of char = (#$EF, #$BB, #$BF);
var FS : TFileStream;
S : AnsiString;
begin
//Se lee el archivo
FS := TFileStream.Create( XMLFileName, fmOpenRead);
try
if FS.Size = 0 then
Exit;
SetLength(S, FS.Size);
FS.Read( S[1], FS.Size);
finally
FS.Free;
end;
//Si el archivo no fue nulo y no empieza con el BOM, se le inserta
if (S[1] <> UTF8BOMString[1]) then begin
FS := TFileStream.Create( XMLFileName, fmCreate);
try
S := UTF8BOMString+S;
FS.Write( S[1], Length(S))
finally
FS.Free;
end;
end;
end;
procedure InsertaBOM(const XMLFileName : AnsiString);
const
UTF8BOMString : array[1..3] of char = (#$EF, #$BB, #$BF);
var FS : TFileStream;
S : AnsiString;
begin
//Se lee el archivo
FS := TFileStream.Create( XMLFileName, fmOpenRead);
try
if FS.Size = 0 then
Exit;
SetLength(S, FS.Size);
FS.Read( S[1], FS.Size);
finally
FS.Free;
end;
//Si el archivo no fue nulo y no empieza con el BOM, se le inserta
if (S[1] <> UTF8BOMString[1]) then begin
FS := TFileStream.Create( XMLFileName, fmCreate);
try
S := UTF8BOMString+S;
FS.Write( S[1], Length(S))
finally
FS.Free;
end;
end;
end;
Saludos!
Gracias , pero no funciona, marca un error, al parecer los tipos de datos son incompatibles.
[DCC Error] Archivo.pas(148): E2015 Operator not applicable to this operand type
// Si el archivo no fue nulo y no empieza con el BOM, se le inserta
if (S[1] <> UTF8BOMString[1]) then
Al respecto del validador del SAT creo que el principal problema es que el SAT no avisa.
Yo he optado por almacenar los XML en SQL 2005 y en este tipo de situaciones lo que regenero es el archivo que contiene el XML anadiendole simplemente los caracteres de control.
Ojala y sirva de algo.