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. 内存使用:对于大文件,我最终使用了超过 GB 的内存,类似于这种情况
  2. XML 文件的生成速度不是很快。
  3. 我的主要问题:XML 是在网络服务器内部生成的,作为对 http 请求的回答。为避免出现问题,必须在生成 XML 时将其写入流。

我将这些问题归咎于使用基于 DOM 的 XML 编写器,但也许即使是基于 DOM 的编写器也可以通过将生成的内容部分写入(和锁定)到流中来处理这种情况。

如何在不过多接触现有代码的情况下解决这种情况?

编辑:虽然这个问题已经结束,但我发布了另一个相关但更常见的问题,该问题针对Delphi 直接编写 XML 的一般能力

4

1 回答 1

0

你可能想看看NativeXMLOmniXML

于 2013-09-06T11:51:36.447 回答