4

我正在使用 Delphi7TClientDataSet为我的一些数据读取和写入 XML 文件。

但是,当我想在程序外部浏览它时(在 Windows 资源管理器中双击 XML),我得到“在文本内容中发现了一个无效字符。错误处理资源' - 即使数据在 Delphi 中可以正常读写。

有没有办法强制TClientDataSet以缩进的方式而不是一行来写它的内容?

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

不管怎样:我发现用 CR/LF 和缩进编写 XML 文件要清楚得多。

4

4 回答 4

8

当您使用该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');
于 2010-10-03T06:54:17.137 回答
4

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

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

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

于 2010-10-03T18:28:40.120 回答
1

I modified your code, because I had some problems with 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;
于 2016-03-24T19:45:45.637 回答
0

dfXMLUTF8 将其用于 UTF

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

于 2021-02-18T21:12:59.683 回答