我应该如何解析Perl中的大型XML文件?

Ash*_*iya 4 xml perl sax

读取以下代码中的XML数据是否会在内存中创建DOM树?

my $xml = new XML::Simple;

my $data = $xml->XMLin($blast_output,ForceArray => 1);
Run Code Online (Sandbox Code Playgroud)

对于大型XML文件,我应该使用SAX解析器,处理程序等吗?

mir*_*rod 14

对于大型XML文件,您可以使用XML :: LibXML,如果文档适合内存,则使用DOM模式,或使用拉模式(请参阅XML :: LibXML :: Reader)或XML :: Twig(我写的,所以我有偏见,但它通常适用于太大而不适合内存的文件).

我不是SAX的粉丝,它很难使用,实际上很慢.

  • 我正在使用`XML :: Twig`来处理大文件 (2认同)

小智 4

我会对两者都说“是”。XML::Simple 库将在内存中创建整个树,并且它是文件大小的很大倍数。对于许多应用程序来说,如果您的 XML 超过 100MB 左右,则实际上不可能在 Perl 中完全加载到内存中。SAX 解析器是一种在读取文件以及打开或关闭标签时获取“事件”或通知的方法。

根据您的使用模式,基于 SAX 或 DOM 的解析器可能会更快:例如,如果您尝试处理大文件中的几个节点或每个节点,那么 SAX 模式可能是最好的。例如,读取大型 RSS 提要并尝试解析其中的每个项目。

另一方面,如果您需要将文件的一个部分与另一部分交叉引用,则 DOM 解析器或通过 XPath 访问将更有意义 - 以 SAX 解析器所需的“由内而外”方式编写它笨拙而棘手。

我建议至少尝试一次 SAX 解析器,因为这样做所需的事件驱动思维是很好的练习。

我使用 XML::SAX::Machines 在 perl 中设置 SAX 解析取得了很好的成功 - 如果您想要多个过滤器和管道,那么设置起来很容易。对于更简单的设置(即 99% 的时间),您只需要一个 sax 过滤器(查看 XML::Filter::Base)并告诉 XML::SAX::Machines 仅解析文件(或从文件句柄读取)你的过滤器。这是一篇详尽的文章。