使用Delphi7 TClientDataSet:是否可以以缩进格式保存XML内容

时间:2010-10-03 06:36:19

标签: xml delphi encoding delphi-7 tclientdataset

我正在使用Delphi7 ClientDataSet来读取和写入我的一些数据的xml文件。

Howerver,当我想在程序外浏览它时(双击Windows资源管理器中的xml)我得到'在文本内容中找到了无效字符。处理资源时出错 - 即使数据在Delphi中读写也很好。

有没有办法强制TClientDataSet以缩进的方式将其内容写入一行?

这样我就可以轻松地将其打开到文本编辑器中,找到会触发上述错误的字符。

无论如何:我发现使用CR / LF写入XML文件更加清晰,并且无论如何都要缩进。

提前谢谢。

4 个答案:

答案 0 :(得分:7)

使用TCustomClientDataSet.SaveToFile过程时,可以选择输出格式,默认情况下,此值设置为dfBinary,以二进制格式对数据进行编码。

 procedure TCustomClientDataSet.SaveToFile(const FileName: string = '';
  Format: TDataPacketFormat = dfBinary);

尝试将Format参数更改为dfXMLdfXMLUTF8

ClientDataSet1.SaveToFile('file.xml',dfXML);

如果要格式化XML输出,可以使用FormatXMLData函数试试此代码

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;

最后你的代码看起来像这样

 ClientDataSet1.SaveToFile('test.xml',dfXML);
 FormatXMLFile('test.xml');

答案 1 :(得分:4)

这是因为您的输出文件中没有指定正确的编码(如<?xml version="1.0" encoding="UTF-8"?>),但它包含一些编码不兼容的字符。

作为RRUZ mentioned,在编写文件时明确指定TDataPacketFormatdfXMLUTF8,肯定会解决“无效字符”错误,因为它会首先编写编码标记:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DATAPACKET Version="2.0">[...]
您也可以在文件的开头手动为现有文件添加编码。

对于可读格式,一些读者可以阅读原始单行并为您进行格式化(FireFox或Internet Exporer等浏览器以及XMLNotePad等XML编辑器)

答案 2 :(得分:0)

我修改了你的代码,因为我在使用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;

答案 3 :(得分:0)

dfXMLUTF8 将其用于 UTF

ClientDataSet1.SaveToFile('test.xml',dfXMLUTF8)