使用能够在生成XML文件时写入流的解决方案替换TXMLDocument(基于DOM)的XML生成

时间:2013-09-06 09:13:27

标签: xml delphi xml-serialization

我有很多代码使用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
  2. 生成XML文件的速度不是很快。
  3. 我的主要问题:XML是在Web服务器内部生成的,作为http请求的答案。要avoid problems,必须在生成XML时将XML写入流中。
  4. 我将问题归结为使用基于DOM的XML编写器,但即使是基于DOM的编写器也可以通过将生成的内容部分写入(并锁定)到流中来处理这种情况。

    如何在不过多触及现有代码的情况下解决此问题?

    修改:此问题已经结束,我发布了另一个相关但更常见的问题,针对general ability of Delphi to directly write XML

1 个答案:

答案 0 :(得分:0)

您可能需要查看NativeXMLOmniXML