Использование Delphi7 TClientDataSet: возможно ли сохранить его содержимое XML в формате с отступом - PullRequest
4 голосов
/ 03 октября 2010

Я использую Delphi7 ClientDataSet для чтения и записи XML-файлов для некоторых из моих данных.

Однако, когда я хочу просмотреть это вне программы (дважды щелкнув по XML в Windows Explorer), я получаюВ текстовом содержимом обнаружен недопустимый символ.Ошибка обработки ресурса '- даже если данные хорошо читаются и записываются из Delphi.

Есть ли способ заставить TClientDataSet писать содержимое с отступом вместо одной строки?

Таким образом, я мог бы легко открыть его в текстовом редакторе и найти, какой символ вызовет вышеуказанную ошибку.

В любом случае: я считаю, что намного проще для XML-файла писать в любом случае с CR / LF и отступами.

Спасибо заранее.

Ответы [ 3 ]

7 голосов
/ 03 октября 2010

Когда вы используете процедуру 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');
4 голосов
/ 03 октября 2010

Это потому, что в вашем выходном файле не указана правильная кодировка (например, <?xml version="1.0" encoding="UTF-8"?>), но она содержит некоторые символы с несовместимой кодировкой.

Если RRUZ упомянул , то при явном указании TDataPacketFormat как dfXMLUTF8 при записи файла наверняка будет решена ошибка «Недопустимый символ», так как сначала будет записан тег кодирования:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DATAPACKET Version="2.0">[...]
Вы также можете добавить кодировку вручную в начале файла для уже существующих файлов.

Что касается удобочитаемого форматирования, некоторые читатели могут читать необработанные однострочные и выполнять форматирование для вас (браузеры, такие как FireFox или Internet Exporer, и XML-редакторы, такие как XMLNotePad )

0 голосов
/ 24 марта 2016

Я изменил ваш код, потому что у меня были некоторые проблемы с 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;
...