9

常にエンコーディング属性を含むレガシー コード (私は書いていません) がありますが、それを D2010 に再コンパイルすると、TXMLDocument にはエンコーディングが含まれなくなります。XML データにはタグとデータの両方にアクセント付き文字が含まれているため、TXMLDocument.LoadFromFile は、ファイルに無効な文字が見つかったことを示す EDOMParseErros をスローするだけです。関連コード:

   Doc := TXMLDocument.Create(nil);  
   try
     Doc.Active := True;
     Doc.Encoding := XMLEncoding;
     RootNode := Doc.CreateElement('Test', '');
     Doc.DocumentElement := RootNode;
     <snip>
     //Result := Doc.XMl.Text;
     Doc.SaveToXML(Result);    // Both lines gives the same result

古いバージョンの Delphi では、次の行が生成されます。

<?xml version="1.0" encoding="ISO-8859-1"?>

D2010 では、これが生成されます。

<?xml version="1.0"?>

ラインを手動で変更すると、すべてが過去数年間常に機能していたように機能します。

更新: XMLEncoding は定数であり、次のように定義されます。

  XMLEncoding = 'ISO-8859-1';
4

2 に答える 2

6

IXMLDocument.CreateProcessingStruction を参照してください。私はOmniXMLを使用していますが、構文は類似しており、すぐに始められるはずです。

var
  FDoc: IXMLDocument;
  PI:  IXMLProcessingInstruction;
begin
  FDoc := OmniXML.CreateXMLDoc();
  PI := FDoc.CreateProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"');
  FDoc.AppendChild(PI);
end;
于 2010-05-03T20:08:54.030 に答える
4
var 
  XMLStream: TStringStream;
begin  
   Doc := TXMLDocument.Create(nil);  
   try
     Doc.Active := True;
     Doc.Encoding := XMLEncoding;
     RootNode := Doc.CreateElement('Test', '');
     Doc.DocumentElement := RootNode;
     <snip>
     XMLStream := TStringStream.Create;
     Doc.SaveToStream(XMLStream);
     Result := XmlStream.DataString;
     XMLStream.Free;

Ken の回答と MSXML 記事へのリンクがあるので、XML プロパティと SaveToXML メソッドを調査することにしました。どちらも MSXMLDOM 実装の XML プロパティを使用します。この記事では、直接読み取ったときにエンコーディングをもたらさないと言われています (「MSXML を使用した新しい XML ドキュメントの作成」セクションの CreateProcessInstruction メソッドの使用直後)。

アップデート:

結果の XML では、アクセント付きの文字が切り捨てられていることがわかりました。その XML のプロセッサが奇妙なエラーをスローし始めたとき、文字が数値の char 定数に変換されていることがわかりました ( #13 はキャリッジ リターンの数値の char 定数です)。だから、私はTStringStreamを使って最終的に正しくしました。

于 2010-05-04T18:37:41.113 に答える