8

编辑:GitHub 上提供了我的(不完整且非常粗糙的)XmlLite 标头翻译

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

转换是从许多大文件 (60MB+) 到一个大文件 (~1GB) 的所有内容元素从根(容器)的简单组合。

<Container>
    <Contents />
    <Contents />
    <Contents />
</Container>

我使用 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
}

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

4

4 回答 4

3

XmlLite是来自 System.Xml 的 xml 读写器的原生 C++ 端口,它提供了拉解析编程模型。它与 W2K3 SP2、WinXP SP3 及更高版本一起提供。在从 C# 到 Delphi 的几乎 1-1 映射之前,您需要一个 Delphi 标头翻译。

于 2011-08-07T00:41:58.973 回答
1

带有 Delphi 包装器Libxml2的libxml可能是一个选项(在此处找到),它具有一些 SAX 支持并且似乎非常可靠 - 网页提到 libxml2 通过了 OASIS XML 测试套件的所有 1800 多个测试。另请参阅:是否有适用于 Delphi 和 Free Pascal 的 SAX 解析器?

于 2011-08-04T14:57:48.877 回答
1

我只是使用常规文件 I/O 将 writeln a 写入文本文件,将每个内容 writeln 作为字符串,最后 writeln 。如果您有更合理的大小,我会将所有内容组装在一个字符串列表中,然后将其流式传输到磁盘。但是,如果您进入 GB 领域,那将是有风险的。

于 2011-08-04T14:23:18.120 回答
0

将此作为答案发布,因为它需要一些空间和格式。

我有一个用于测试的 baaad 数据文件,请参阅 https://github.com/the-Arioch/omnixml/commit/d1a544048e86921983fced67c772944f12cb1427上的消息

这里 OmniXML 在 XE2 调试版本中有点糟糕:

  • 内存使用量比 TXmlDocument/MSXML 多 25%。修复 .NextSibling 问题后可能会更多,没有重新测试。
  • 更长的文件加载时间(OTOH 读取节点属性的速度明显更快:它们已经是 Delphi 类型的变量,没有跨越 MSXML/Delphi 边界)
  • 绝对不支持命名空间,这使得识别标签变得更加困难
  • XPath 处于萌芽状态,包括再次缺少命名空间

https://docs.google.com/spreadsheets/d/1QcFVwh3fFfaDyRmv2b-n4Rq4_u5p42UfNbR_FZgZizY/edit?usp=sharing

于 2016-10-04T12:16:40.060 回答