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

标签 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
XML文件的生成不是很快。
我的主要问题:XML是在Web服务器内部生成的,作为对HTTP请求的答复。对于avoid problems,必须在生成XML时将其写入流中。


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

如何解决这种情况而又不用过多地使用现有代码?

编辑:关闭此问题时,我发布了另一个相关但更常见的问题,该问题针对general ability of Delphi to directly write XML

最佳答案

您可能想看看NativeXMLOmniXML

关于xml - 使用能够在生成XML文件时写入流的解决方案来替换TXMLDocument(基于DOM)的XML生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18654127/

相关文章:

javascript - 使用 JS 和 XML 更改文本控件中的 OData 值

java.lang.RuntimeException : Unable to start activity ComponentInfo{} android. view.InflateException:二进制 XML 文件行 #8:

delphi - 将 FPC .o 文件链接到 Delphi

c# - 如何从响应中删除 "method"节点?

c# - 如何使用 XmlSerializer 序列化对象集合

ruby-on-rails - Rails XML 生成,如 Active Model Serializer

java - 无法查明 Java 中 'Null Pointer Exception' 的原因

xml - 从 XML 文件中提取标签信息到 Excel 文件

delphi - 使用 SendData 会导致收到的字符串损坏

delphi - 在 Delphi 的 Tqueue 中存储记录指针的正确方法是什么