我正在使用Delphi7 ClientDataSet来读取和写入我的一些数据的xml文件。
Howerver,当我想在程序外浏览它时(双击Windows资源管理器中的xml)我得到'在文本内容中找到了无效字符。处理资源时出错 - 即使数据在Delphi中读写也很好。
有没有办法强制TClientDataSet以缩进的方式将其内容写入一行?
这样我就可以轻松地将其打开到文本编辑器中,找到会触发上述错误的字符。
无论如何:我发现使用CR / LF写入XML文件更加清晰,并且无论如何都要缩进。
提前谢谢。答案 0 :(得分:7)
使用TCustomClientDataSet.SaveToFile
过程时,可以选择输出格式,默认情况下,此值设置为dfBinary
,以二进制格式对数据进行编码。
procedure TCustomClientDataSet.SaveToFile(const FileName: string = '';
Format: TDataPacketFormat = dfBinary);
尝试将Format
参数更改为dfXML
或dfXMLUTF8
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,在编写文件时明确指定TDataPacketFormat
为dfXMLUTF8
,肯定会解决“无效字符”错误,因为它会首先编写编码标记:
<?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)