L'utilisation Delphi7 TClientDataSet: est-il possible d'avoir l'enregistrer son contenu XML dans un format dentelée

StackOverflow https://stackoverflow.com/questions/3848853

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.

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top