Использование Delphi7 TClientDataSet: возможно ли сохранить содержимое XML в формате с отступом?

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

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

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

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

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


person Edelcom    schedule 03.10.2010    source источник
comment
-1. Неясно, как отступ XML решит проблему недопустимых символов. Уточните, пожалуйста, какую проблему вы хотите решить. Если у вас две проблемы, задайте два вопроса.   -  person Rob Kennedy    schedule 03.10.2010
comment
@Rob Kennedy: Вы когда-нибудь пытались редактировать xml-файл в текстовом редакторе, где весь файл находится в одной строке? Если файл имеет отступ и, следовательно, использует cr/lf в качестве разделителя строк, вы можете легко загрузить его в редакторе и, по крайней мере, визуально просмотреть файл, чтобы найти виновный символ (или символы). Где вы видите два вопроса? Я спросил, можно ли заставить TClientDataset записать файл в формате xml с отступом. Ошибка заключалась в том, чтобы уточнить, зачем мне это нужно. Название вопроса говорит, что я спрашивал, нет? -1 здесь не нужен.   -  person Edelcom    schedule 04.10.2010
comment
Здесь я должен согласиться с Робом, потому что почти во всех средах разработки есть возможность автоматического форматирования XML-кода. Даже если вы этого не сделаете, существует множество веб-сайтов, которые могут помочь вам отформатировать ваш код. Настраивать очень распространенный компонент базы данных в Delphi так, чтобы он делал то, для чего он не был создан, — это немного чрезмерно для вашей ситуации. Также неясно, хотите ли вы, чтобы ваша ошибка была исправлена, или вы хотите, чтобы клиентский набор данных сохранял XML с отступом.   -  person Jerry Dodge    schedule 09.09.2013


Ответы (4)


Это связано с тем, что правильная кодировка (например, <?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)

person Francesca    schedule 03.10.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');
person RRUZ    schedule 03.10.2010
comment
Имейте в виду, что если данные содержат символы 'çé...', как в François, сохранения как dfXML недостаточно, требуется dfXMLUTF8. - person Francesca; 03.10.2010

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

dfXMLUTF8 используйте его для UTF

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

person Pit    schedule 18.02.2021