9

我想知道在 Perl 的情况下,哪种 XML 解析器最适合我。我做了很多阅读并尝试了XML::LibXMLand XML::SAX。第一个用了太多内存,第二个对我来说似乎没有那么快(即使在关闭纯 perl 解析器之后)。

我的需求相当具体。我通过Net::SSH库收到高达 50MB 的较大响应。我想在收到这些数据时将其传递给 XML 库,以便在内存中保持最少的数据量。然后我需要在某些标签中查找数据并对其执行任何操作,在某些情况下汇总一堆值,在其他情况下只需提取值并将它们写入文件或其他任何内容。所以我需要一个可以连续工作、工作速度快、使用最少内存的 XML 解析器。我得到的数据最多为 1024 字节,所以我希望能够做类似的事情$myparser->sendData($mynewData),然后在打开或关闭新标签时调用函数,类似于所做的事情XML::SAX

我不一定需要 XPath 或 XSLT。

4

3 回答 3

7

我建议使用XML::Twig.

这个模块使用起来非常方便,而且它可以在不占用太多内存的情况下串行读取数据。

可能最显着的特点之一XML::Twig是它允许在所谓的混合模型中解析 XML:您可以解析整个文档(需要整个文档和大量内存),您可以使用回调来解析小块(允许流式传输,内存消耗小),或者您可以使用这些的任意组合。

事实证明,这种组合模型是最方便的功能 - 从流中加载小叶子,您可以免费有效地访问它的所有小分支。

于 2013-01-03T05:32:37.647 回答
4

您也可以使用普通的 old XML::Parser,它几乎可以满足您的要求:

“这个模块提供了解析 XML 文档的方法。它建立在 XML::Parser::Expat 之上,这是 James Clark 的 expat 库的一个较低级别的接口。每次调用其中一个解析方法都会创建一个新的 XML 实例::Parser::Expat 然后用于解析文档。可以在创建 XML::Parser 对象时提供 Expat 选项。然后在每次解析调用时将这些选项传递给 Expat 对象。也可以给出它们作为解析方法的额外参数,在这种情况下,它们会覆盖在 XML::Parser 创建时给出的选项。"

“Expat 是一个基于事件的解析器。当解析器识别文档的某些部分(比如 XML 元素的开始或结束标记)时,任何为该类型事件注册的处理程序都会使用合适的参数调用。”

我用它来解析Wikipedia XML 转储,即使在压缩后也有几 GB 的大小,并且发现它可以很好地解决这个问题。与此相比,一个 50 MB 的文件应该是小菜一碟。

于 2013-01-03T07:18:06.893 回答
3

XML::LibXML 还带有两个流解析器,它们应该比纯 Perl 解决方案更快:

XML::LibXML::SAX

与 XML::SAX 兼容的 SAX 解析器。

XML::LibXML::Reader

libxml2 的拉解析器的接口。它提供了比 SAX 更简单的接口并且速度更快一些。据我所知,XML::LibXML::Reader 是解析 XML 文件而不将它们完全加载到内存中最快的 Perl 模块。

于 2013-01-07T13:13:25.840 回答