在Perl中串行处理XML数据

我想知道哪个XMLparsing器的人事情将是我的情况下最好的Perl。 我做了很多的阅读,并尝试过XML::LibXMLXML::SAX 。 第一个用完了太多的内存,第二个对我来说看起来并不那么快(甚至在closures纯粹的perlparsing器之后)。

我的需求相当具体。 通过Net::SSH库,我收到了最多50MB的大量响应。 我希望将这些数据传递给XML库,以便将最小数量的数据保存在内存中。 然后,我需要在某些标签中查找数据,并对其进行任何操作,在某些情况下,可以对一些值进行求和,而在其他情况下只需提取值并将其写入文件或其他任何内容。 所以我需要一个可以串行工作的XMLparsing器,快速工作并使用最less的内存。 我得到的数据最多为1024个字节,所以我希望能够像$myparser->sendData($mynewData)那样做一些事情,然后在打开或closures一个新标签时调用类似于XML::SAX函数XML::SAX确实。

我不一定需要XPath或XSLT。

Solutions Collecting From Web of "在Perl中串行处理XML数据"

你也可以使用简单的旧的XML::Parser ,它几乎正是你所要求的:

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

“Expat是一个基于事件的解析器,由于解析器可以识别文档的各个部分(比如XML元素的开始或结束标签),因此,使用合适的参数调用任何注册了该类型事件的处理程序。

我用它来解析维基百科XML转储文件 ,即使在压缩之后也有几GB的大小,并且发现它能够很好地工作。 相比之下,一个50 MB的文件应该是小菜一碟。

我会建议使用XML::Twig

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

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

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

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

XML ::的libxml :: SAX

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

XML ::的libxml ::读卡器

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