什么是Ruby的快速XML解析器?

时间:2010-10-27 18:56:58

标签: ruby xml parsing

我正在使用适用于小型文档的Nokogiri。但对于180KB的HTML文件,我必须通过ulimit -s增加进程堆栈大小,解析和XPath查询需要很长时间。

使用股票Ruby分发是否有更快的方法?

我习惯了XPath,但解决方案不一定需要支持XPath。

标准是:

  1. 快写。
  2. 快速执行。
  3. 强大的解析器。

5 个答案:

答案 0 :(得分:16)

查看Ox宝石。它比LibXML和Nokogiri更快,并支持内存解析以及SAX回调解析。完全披露,我写了。


在性能比较http://www.ohler.com/software/thoughts/Blog/Entries/2011/9/21_XML_with_Ruby.html中,比较DOM(内存中)和SAX(回调)解析器。

答案 1 :(得分:6)

Nokogiri基于libxml2,它是任何语言中速度最快的XML / HTML解析器之一。它是用C语言编写的,但是有许多语言的绑定。

问题是文件越复杂,在内存中构建完整的DOM结构所需的时间就越长。与其他解析方法相比,创建DOM更慢且占用内存更多(通常整个DOM必须适合内存)。 XPath依赖于这个DOM。

SAX通常是人们对速度或不适合内存的大型文档的转向。它更多的是事件驱动:它通知你一个start元素,end元素等,你编写处理程序来对它们作出反应。这有点痛苦,因为你最终会自己跟踪状态(比如你在哪个元素里面)。

有一个中间立场:一些解析器具有“拉解析”功能,您可以在其中进行类似光标的导航。您仍然按顺序访问每个节点,但您可以“快进”到您不感兴趣的元素的末尾。它具有SAX的速度,但是用于许多用途的更好的界面。我不知道Nokogiri是否可以为HTML执行此操作,但如果您有兴趣,我会调查Reader API

请注意,Nokogiri对格式错误的标记(例如真实HTML)也非常宽容,仅此一点就使它成为HTML解析的一个很好的选择。

答案 2 :(得分:2)

答案 3 :(得分:0)

您可能会发现,对于较大的XML文档,DOM解析的性能不是很高。这是因为解析器必须构建XML文档结构的内存映射。

通常需要更小内存占用的另一种方法是使用事件驱动的SAX解析器。

Nokogiri完全支持SAX。

答案 4 :(得分:0)

根据您的环境,Oga可能更适合作为Ruby的足够快的 XML解析器,具有更好的界面和更快的安装时间。