4

TClientDataSet一部のデータのXMLファイルの読み取りと書き込みにDelphi7を使用しています。

ただし、これをプログラムの外部で参照したい場合(WindowsエクスプローラーでXMLをダブルクリックすると)、'テキストコンテンツに無効な文字が見つかりました。リソースの処理中にエラーが発生しました'-データはDelphi内から正常に読み書きできますが。

TClientDataSet1行ではなくインデントされた方法でコンテンツを強制的に書き込む方法はありますか?

そうすれば、テキストエディタで簡単に開いて、上記のエラーを引き起こす文字を見つけることができます。

とにかく:XMLファイルをCR / LFで記述し、とにかくインデントする方がはるかに明確だと思います。

4

4 に答える 4

8

この手順を使用する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');
于 2010-10-03T06:54:17.137 に答える
4

これは、適切なエンコーディング(など<?xml version="1.0" encoding="UTF-8"?>)が出力ファイルで指定されていないためですが、互換性のないエンコーディングの文字がいくつか含まれています。

RRUZが述べたように、ファイルを書き込むときにTDataPacketFormatasを明示的に指定すると、最初にエンコーディングタグが書き込まれるため、「無効な文字」エラーが最も確実に解決さ れます。既存のファイルのエンコーディングをファイルの先頭に手動で追加することもできます。dfXMLUTF8
<?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

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 に答える