2

次のような TXMLDocument を使用して XML を生成するコードがたくさんあります。

function Obj.SaveToXmlNode(XmlNode: IXmlNode; SubnodeName: string): IXmlNode;
begin
    Result := XmlNode.AddChild(SubnodeName);
    SaveFieldToXmlNode(Result, 'FIELD1', 'Value1', 'PrevValue1');
    SaveFieldToXmlNode(Result, 'FIELD2', 'Value2', 'PrevValue2');
    //...
end;

function SaveFieldToXmlNode(XmlNode: IXmlNode; FieldName: string; NewVal: Variant;
            OldVal: Variant): IXmlNode;
var
    FieldNode: IXMLNode;
begin
    FieldNode := XmlNode.AddChild(FieldName);
    FieldNode.NodeValue := NewVal;
    if not VarIsEmpty(OldVal) then
            FieldNode.Attributes[XML_OLDVALUE] := OldVal;
end;

大きな XML ファイルを生成するためにこの実装を使用すると、深刻な問題が発生しました。

  1. メモリ使用量: 大きなファイルの場合、このケースと同様に 1 GB を超えるメモリを使用することになりました。
  2. XML ファイルの生成はそれほど高速ではありません。
  3. 私の主な問題: XML は、http 要求への応答として Web サーバー内で生成されます。問題を回避するには、生成中に XML をストリームに書き込む必要があります。

私はこの問題を DOM ベースの XML ライターの使用に起因すると考えましたが、おそらく DOM ベースのライターでも、生成されたコンテンツを部分的にストリームに書き込み (およびロック) することで、この状況を処理できます。

既存のコードにあまり手を加えずに、この状況を解決するにはどうすればよいですか?

編集:この質問はクローズされましたが、関連するがより一般的な別の質問を投稿しました。これは、Delphi が XML を直接書き込む一般的な機能を対象としています。

4

1 に答える 1

0

NativeXMLまたはOmniXMLをご覧ください。

于 2013-09-06T11:51:36.447 に答える