我有很多使用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 GB的内存,类似于this case。
XML文件的生成不是很快。
我的主要问题:XML是在Web服务器内部生成的,作为对HTTP请求的答复。对于avoid problems,必须在生成XML时将其写入流中。
我将问题归因于使用基于DOM的XML编写器,但也许甚至是基于DOM的编写器也可以通过将生成的内容部分写入(和锁定)流中来处理这种情况。
如何解决这种情况而又不用过多地使用现有代码?
编辑:关闭此问题时,我发布了另一个相关但更常见的问题,该问题针对general ability of Delphi to directly write XML。
最佳答案
关于xml - 使用能够在生成XML文件时写入流的解决方案来替换TXMLDocument(基于DOM)的XML生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18654127/