Delphi 2010, Problema com “encoding” usando TXMLDocument
Código-Fonte, Dicas Blog, Programação dezembro 17th, 2009
Estava recompilando alguns componentes do meu sistema, desenvolvidos originalmente com o Delphi 7 para o Delphi 2010, e percebi o seguinte erro ao tentar abrir um XML gerado pela aplicação compilada com o D2010 “caractere inválido encontrado no texto“.
Na verdade o XML contêm campos acentuados usando “ISO-8859-1” e, após algum tempo perdido descobri que o código abaixo, embora estivesse correto não gerava o XML como deveria; ou seja, a propriedade “encoding” simplesmente não é adicionada (como deveria) no cabeçalho do XML. Isso não acontece no Delphi 7, por exemplo.
01 – Codigo que não funciona no Delphi 2010:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // Gerar o XML vXMLDoc := TXMLDocument.Create(self); try With vXMLDoc do begin Active := True; Encoding := 'ISO-8859-1'; Version := '1.0'; AddChild('0150'); Node150 := DocumentElement; With IBQLv150 do begin while not eof do begin NodeDados := Node150.AddChild('participante'); With NodeDados do begin AddChild('COD_PART').Nodevalue := FieldByname('registro').AsString+ FieldByName('tipo').AsString; AddChild('NOME').Nodevalue := FieldByname('participante').AsString; AddChild('COD_PAIS').Nodevalue := '01058'; //...cont. end; next; end; end; end; // vxmldoc Result := vXMLdoc.XML.Text finally vXMLDoc.Free; end; |
Após descobrir o problema, fui atrás de uma possível solução no “QualityCentral” da Embarcadero e, descobri ali uma solução “paliativa” para o problema. Primeiro, o encoding somente é adicionado ao XML se for informado o valor “UTF-16”. Mas, essa codificação não é a que eu preciso e dai?
A solução (clique aqui para ver no QualityCentral) se dá através de um pequeno “macete”; gere o XML com “UTF-16” e, em seguida execute um replace antes de devolver o conteúdo; como pode ser visto na linha X do código após aplicado o “macete”.
02 – Codigo modificado (repare linhas 6 e 26), contendo solução para usar o encoding no Delphi 2010:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // Gerar o XML vXMLDoc := TXMLDocument.Create(self); try With vXMLDoc do begin Active := True; Encoding := 'UTF-16'; Version := '1.0'; AddChild('0150'); Node150 := DocumentElement; With IBQLv150 do begin while not eof do begin NodeDados := Node150.AddChild('participante'); With NodeDados do begin AddChild('COD_PART').Nodevalue := FieldByname('registro').AsString+ FieldByName('tipo').AsString; AddChild('NOME').Nodevalue := FieldByname('participante').AsString; AddChild('COD_PAIS').Nodevalue := '01058'; //...cont. end; next; end; end; end; // vxmldoc Result := STRTRAN(vXMLdoc.XML.Text,'UTF-16','UTF-8'); finally vXMLDoc.Free; end; |
Funciona, mas, vamos aguardar uma solução definitva não é mesmo?.