L'utilisation Delphi7 TClientDataSet: est-il possible d'avoir l'enregistrer son contenu XML dans un format dentelée
-
27-09-2019 - |
Question
J'utilise Delphi7 ClientDataSet pour lire les fichiers xml d'écriture pour certains de mes données.
Howerver, quand je veux parcourir ce en dehors du programme (double-cliquant le code XML dans l'Explorateur Windows) je reçois le « Un caractère non valide a été trouvé dans le contenu du texte. Erreur lors du traitement des ressources » -. Même si les données lit et écrit bien à partir de Delphi
Y at-il un moyen de forcer TClientDataSet à écrire son contenu de façon dentelée à la place dans une ligne?
De cette façon, je pourrais facilement ouvrir dans un éditeur de texte et de trouver quel personnage déclenchera l'erreur ci-dessus.
Quoi qu'il en soit. Je trouve beaucoup plus clair pour un fichier XML à écrire avec CR / LF et tirets de toute façon
Thx à l'avance.
La solution
Il est parce que le codage correct (comme <?xml version="1.0" encoding="UTF-8"?>
) n'a pas être spécifié dans votre fichier de sortie, mais il contient des caractères avec un codage incompatible.
RRUZ mentionné , spécifiant explicitement le TDataPacketFormat
comme dfXMLUTF8
lors de l'écriture du fichier résoudre le plus certainement l'erreur « caractère non valide », comme il rédigera la balise de codage premier:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DATAPACKET Version="2.0">[...]
Vous pouvez également ajouter le codage manuellement au début du fichier pour les fichiers déjà existants.
En ce qui concerne la mise en forme lisible, certains lecteurs peuvent lire le one-liner brut et le formatage pour vous (comme les navigateurs FireFox ou Internet Exporer et éditeurs XML comme XMLNotePad )
Autres conseils
Lorsque vous utilise la procédure TCustomClientDataSet.SaveToFile
, vous pouvez choisir la sortie format, par défaut, cette valeur est définie sur dfBinary
Wich coder les données dans un format binaire.
procedure TCustomClientDataSet.SaveToFile(const FileName: string = '';
Format: TDataPacketFormat = dfBinary);
essayez de changer le paramètre Format
dfXML
ou dfXMLUTF8
ClientDataSet1.SaveToFile('file.xml',dfXML);
si vous voulez formater la sortie XML, vous pouvez utiliser la fonction FormatXMLData
essayer ce code
uses
XMLDoc;
Procedure FormatXMLFile(XmlFile:string);
var
oXml : TXMLDocument;
begin
oXml := TXMLDocument.Create(nil);
try
oXml.LoadFromFile(XmlFile);
oXml.XML.Text:=xmlDoc.FormatXMLData(oXml.XML.Text);
oXml.Active := true;
oXml.SaveToFile(XmlFile);
finally
oXml := nil;
end;
end;
enfin code ressemblera à ceci
ClientDataSet1.SaveToFile('test.xml',dfXML);
FormatXMLFile('test.xml');
Je modifié votre code, parce que j'ai eu quelques problèmes avec UTF-8:
Procedure FormatXMLFile(XmlFile:string);
var
oXml : TXMLDocument;
s : utf8String;
begin
oXml := TXMLDocument.Create(nil);
try
oXml.LoadFromFile(XmlFile);
s := oxml.XML.Text;
s := StringReplace(s, '><', '>' + #13#10 + '<' , [rfReplaceAll]);
//oXml.XML.Text:=xmlDoc.FormatXMLData(oxml.XML.Text);
oxml.XML.Text := s;
oXml.Active := true;
oXml.SaveToFile(XmlFile);
finally
oXml := nil;
end;
end;