在perl中系列地处理XML数据

Mik*_*lls 9 xml linux perl centos

我想知道在我的Perl情况下哪个XML解析器的人最好.我做了很多阅读,并尝试了XML::LibXMLXML::SAX.第一个耗尽了太多的内存而第二个对我来说似乎并不那么快(即使在关闭纯perl解析器之后).

我的需求非常具体.我通过Net::SSH图书馆收到了高达50MB的大回复.我希望在收到数据时将此数据传递给XML库,以便将最少量的数据保存在内存中.然后我需要在某些标签中查找数据并对其执行任何操作,在某些情况下总和一堆值,在其他情况下只需提取值并将它们写入文件或其他任何内容.所以我需要一个可以串行工作,快速工作并使用最少内存的XML解析器.我得到的数据是最多1024字节的块,所以我希望能够做类似的事情$myparser->sendData($mynewData),然后在打开或关闭新标签时调用函数XML::SAX.

我不一定需要XPath或XSLT.

mvp*_*mvp 7

我建议使用XML::Twig.

该模块使用起来非常方便,并且可以在不占用大量内存的情况下串行读取数据.

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

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


Ilm*_*nen 4

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

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

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

我用它来解析Wikipedia XML 转储,即使在压缩后,转储的大小也有几 GB,并且发现它对此非常有效。相比之下,50 MB 的文件应该是小菜一碟。