我有很多使用 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 文件时遇到了严重的问题:
- 内存使用:对于大文件,我最终使用了超过 GB 的内存,类似于这种情况。
- XML 文件的生成速度不是很快。
- 我的主要问题:XML 是在网络服务器内部生成的,作为对 http 请求的回答。为避免出现问题,必须在生成 XML 时将其写入流。
我将这些问题归咎于使用基于 DOM 的 XML 编写器,但也许即使是基于 DOM 的编写器也可以通过将生成的内容部分写入(和锁定)到流中来处理这种情况。
如何在不过多接触现有代码的情况下解决这种情况?
编辑:虽然这个问题已经结束,但我发布了另一个相关但更常见的问题,该问题针对Delphi 直接编写 XML 的一般能力。