Замена XML-генерации TXMLDocument (на основе DOM) решением, способным выполнять запись в поток во время генерации XML-файла.
У меня есть много кода, который генерирует XML с использованием TXMLDocument, который выглядит следующим образом:
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:
Использование памяти: для больших файлов я использовал больше, чем ГБ памяти, какэтот случай.Генерация XML-файла не очень быстрая.Моя главная проблема: XML генерируется внутри веб-сервера как ответ на запрос http. кизбегать проблемXML должен быть записан в поток во время его генерации.Я объяснил проблемы использованием XML-модуля записи на основе DOM, но, возможно, даже модуль записи на основе DOM может справиться с этой ситуацией путем частичной записи (и блокировки) сгенерированного содержимого в поток.
Как я могу разрешить эту ситуацию, не слишком касаясь моего существующего кода?
Редактировать: Пока этот вопрос был закрыт, я разместил еще один связанный, но более распространенный вопрос, нацеленный наобщая способность Delphi напрямую писать XML.