我想知道在我的Perl情况下哪个XML解析器的人最好。我做了很多阅读,并尝试了XML::LibXML
和XML::SAX
。第一个耗尽了太多的内存而第二个对我来说似乎并不那么快(即使在关闭纯perl解析器之后)。
我的需求非常具体。我通过Net::SSH
库收到了高达50MB的大回复。我想在收到它时将这些数据传递给XML库,以便将最少量的数据保存在内存中。然后我需要在某些标签中查找数据并对其执行任何操作,在某些情况下总和一堆值,在其他情况下只需提取值并将其写入文件或其他任何内容。所以我需要一个可以串行工作,快速工作并使用最少内存的XML解析器。我得到的数据是最多1024个字节的块,所以我希望能够像$myparser->sendData($mynewData)
那样执行某些操作,然后在打开或关闭新标记时调用函数,类似于XML::SAX
确实。
我不一定需要XPath或XSLT。
答案 0 :(得分:7)
我建议使用XML::Twig
。
该模块使用起来非常方便,而且它可以连续读取数据而不需要占用太多内存。
XML::Twig
最显着的特点之一就是它允许在所谓的混合模型中解析XML:你可以解析整个文档(需要整个文档和大量内存),你可以使用回调解析小块(允许流式传输,小内存消耗),或者你可以使用它们的任意组合。
这个组合模型是最方便的功能 - 从流中加载小叶子,您可以有效地免费访问所有小分支。
答案 1 :(得分:4)
你也可以选择普通的XML::Parser
,这几乎就是你所要求的:
“这个模块提供了解析XML文档的方法。它建立在XML :: Parser :: Expat之上,它是James Clark的expat库的低级接口。每次调用一个解析方法都会创建一个新的XML :: Parser :: Expat的实例,然后用于解析文档。当创建XML :: Parser对象时,可以提供Expat选项。然后在每次解析调用时将这些选项传递给Expat对象。也可以作为解析方法的额外参数给出,在这种情况下,它们会覆盖在XML :: Parser创建时给出的选项。“
“Expat是一个基于事件的解析器。由于解析器识别文档的某些部分(比如XML元素的开始或结束标记),然后使用合适的参数调用为该类型的事件注册的任何处理程序。”< / p>
我已经用它来解析Wikipedia XML dumps,即使在压缩之后也只有几GB的大小,并且发现它可以很好地工作。相比之下,一个50 MB的文件应该是小菜一碟。
答案 2 :(得分:3)
XML :: LibXML还带有两个流解析器,它们应该比纯Perl解决方案更快:
与XML :: SAX兼容的SAX解析器。
libxml2的pull解析器的接口。它提供了比SAX更简单的接口,并且速度更快。据我所知,XML :: LibXML :: Reader是解析XML文件最快的Perl模块,无需将它们完全加载到内存中。