Substituindo a geração XML TXMLDocument (baseada em DOM) por uma solução capaz de gravar em um fluxo enquanto o arquivo XML é gerado
Eu tenho um monte de código que gera um XML usando TXMLDocument, que se parece com isso:
function Obj.SaveToXmlNode(XmlNode: IXmlNode; SubnodeName: string): IXmlNode;
begin
Result := XmlNode.AddChild(SubnodeName);
SaveFieldToXmlNode(Result, 'FIELD1', 'Value1', 'PrevValue1');
SaveFieldToXmlNode(Result, 'FIELD2', 'Value2', 'PrevValue2');
//...
end;
com
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;
Eu encontrei problemas sérios usando esta implementação para gerar um grande arquivo XML:
Uso de memória: para arquivos grandes, acabei usando mais de um GB de memória, semelhante aoeste caso.A geração do arquivo XML não é muito rápida.Meu principal problema: o XML é gerado dentro de um servidor da web como resposta a uma solicitação http. Paraevitar problemas, o XML deve ser gravado no fluxo enquanto estiver sendo gerado.Atribuí os problemas ao uso de um gravador de XML baseado em DOM, mas talvez até um gravador baseado em DOM possa lidar com essa situação escrevendo parcialmente (e bloqueando) o conteúdo gerado em um fluxo.
Como posso resolver essa situação sem tocar muito no meu código existente?
Editar: Enquanto essa pergunta foi encerrada, publiquei outra pergunta relacionada, mas mais comum, que visa ocapacidade geral do Delphi de escrever diretamente XML.