8

我需要关于在 Delphi 中使用什么(我使用 Delphi 2009)以尽可能快地处理非常大的 XML 文件(例如 100 MB)的建议。

我需要输入 XML,从我的程序中访问和更新其中的数据,然后再次导出修改后的 XML。

希望输入和输出可以在快速的 Windows 机器上在几秒钟内完成。


澄清。我预计我将需要使用 DOM,因为访问用于开发报告和更新数据的数据结构很重要,并且我需要此功能非常快速。

输入只为文件加载完成一次,输出只为文件保存完成,通常只在退出时完成一次。这些也应该很快,但不如内存数据访问和更新重要。

我的理解是,第 3 方解析器仅对输入和输出有帮助,而不是在加载到内存后使用和修改数据。还是我错了?

4

8 回答 8

7

如果我正确理解了您的问题,那么您已经知道数据结构并且您正在修改数据 - 而不是文件的 XML 结构。

在这些情况下,如果性能至关重要,那么您可以尝试直接进行文本操作 - 跳过 XML 解析。

从流中读取,使用一些快速的文本搜索算法,例如Boyer-Moore,找到您需要修改数据的地方,进行修改并将数据输出到另一个流中。

这将是一次性的,没有 XML 解析,没有内存中的 XML 树构建。

于 2008-11-05T08:24:27.147 回答
5

SAX 值得考虑,而不是 DOM 解析器。

使用 DOM,您需要支付加载文档的开销,但一旦加载数据,就可以快速访问和更新。

使用 SAX,您必须为 begin-element、end-element 等编写处理程序,但您在进行操作时拥有更大的灵活性。

尽管它可能对您的情况没有帮助,但 SAX 在您搜索时非常有用,因为您可以在任何时候停止解析,因此一旦您找到了您想要的内容,您就可以停止。

如果您的程序在知道要进行哪些更改之前不需要解析所有数据,您可以编写 SAX 处理程序,在读取数据时更新数据并以其他方式传递数据,这样它就可以流式传输数据,而不必将其全部加载到任何类型的内存结构中。这将使解决方案非常可扩展,因为您不会遇到非常大的文件的内存限制。

对于它的价值,我倾向于使用 MSXML DOM 和 SAX 解析器。可以说它们不是表现最好的,我认为可能有更多的人在努力改进它们,所以它们会变得越来越好。

于 2008-11-05T01:44:42.320 回答
4

我对SimDesign 的NativeXML非常满意。它还包括一个名为 FastXML 的特殊版本,我尚未对其进行测试,但据说它很快。

于 2008-11-05T07:14:31.140 回答
3

您可能想看看The Delphi Inspiration 中的 DIHtmlParser 组件。它应该“非常快,尤其是在解析大文件时”,并且“在现代机器上,每秒的 HTML 数据超过 15 MB”。尽管我从未尝试过处理大文件,但我对它有过一些很好的体验。

于 2008-11-05T01:36:58.577 回答
2

我不是专家,但我相信共识是​​ SAX 解析器将比 DOM 更有效......

于 2008-11-05T00:56:08.707 回答
1

如果您曾经考虑过事件驱动的 SAX 方式,那么XML Parser 库可能会非常方便。

于 2008-11-06T11:38:04.150 回答
0

我刚刚发现的另一种可能性是使用我购买的LMD ElPack 包,它们包含一个 XML 支持库,他们说“速度非常快,完全支持 unicode,并且只为您的 Exe 文件增加了很小的空间”。

查看包含在 LMD 7 包(用于 Delphi 2009)中的 LMDXML.pas 单元的源代码,它说该代码基于 Michail Vlasov 的 SimpleXML Release 8.0(2006 年 7 月)代码。

于 2008-11-07T03:59:47.647 回答
0

如果您只需要直接操作,我会同意 zendar 的回答。

至于 DOM 或 SAX 实现,我会推荐DIXml

于 2009-05-08T07:11:50.920 回答