如何在Delphi中使用MSXML SAX组合大型XML文件

car*_*mon 8 delphi com sax msxml6

编辑:我的(不完整和非常粗糙)XmlLite标题翻译在GitHub可用

在不使用DOM的情况下,将Delphi中的大量XML文档与MSXML简单组合的最佳方法是什么?我应该使用COM组件SAXReader和XMLWriter吗?有什么好的例子吗?

转换是从根(Container)到许多大文件(60MB +)到一个巨大文件(~1GB)的所有Contents元素的简单组合.

<Container>
    <Contents />
    <Contents />
    <Contents />
</Container>
Run Code Online (Sandbox Code Playgroud)

我使用XmlWriter和XmlReaders在以下C#代码中工作,但它需要在本机Delphi进程中进行:

var files = new string[] { @"c:\bigFile1.xml", @"c:\bigFile2.xml", @"c:\bigFile3.xml", @"c:\bigFile4.xml", @"c:\bigFile5.xml", @"c:\bigFile6.xml" };

using (var writer = XmlWriter.Create(@"c:\HugeOutput.xml", new XmlWriterSettings{ Indent = true }))
{
    writer.WriteStartElement("Container");

    foreach (var inputFile in files)
        using (var reader = XmlReader.Create(inputFile))
        {
            reader.MoveToContent();
            while (reader.Read())
                if (reader.IsStartElement("Contents"))
                    writer.WriteNode(reader, true);
        }

    writer.WriteEndElement(); //End the Container element
}
Run Code Online (Sandbox Code Playgroud)

我们已经在系统的其他部分使用MSXML DOM,如果可能的话我不想添加新的组件.

Sam*_*ang 3

XmlLite是 System.Xml 的 xml 读取器和写入器的本机 C++ 端口,它提供拉式解析编程模型。W2K3 SP2、WinXP SP3 及以上版本均附带该产品。在从 C# 到 Delphi 的几乎 1-1 映射之前,您需要一个 Delphi 头文件转换。