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

什么是Ruby的快速XML解析器?,ruby,xml,parsing,Ruby,Xml,Parsing,我正在使用Nokogiri,它可以很好地处理小文档。但是对于一个180KB的HTML文件,我必须通过ulimit-s增加进程堆栈的大小,解析和XPath查询需要很长时间 使用stock Ruby发行版有更快的方法吗 我已经习惯了XPath,但解决方案不一定需要支持XPath 这些准则是: 写得快 快速执行 健壮的结果解析器 您可能会发现,对于较大的XML文档,DOM解析的性能不是很好。这是因为解析器必须构建XML文档结构的内存映射 另一种通常需要较小内存占用的方法是使用事件驱动的SAX解析器 N

我正在使用Nokogiri,它可以很好地处理小文档。但是对于一个180KB的HTML文件,我必须通过
ulimit-s
增加进程堆栈的大小,解析和XPath查询需要很长时间

使用stock Ruby发行版有更快的方法吗

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

这些准则是:

  • 写得快
  • 快速执行
  • 健壮的结果解析器

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

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


    Nokogiri完全支持SAX。

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

    问题是,文件越复杂,在内存中构建完整的DOM结构所需的时间就越长。与其他解析方法相比,创建DOM的速度较慢,内存消耗也更大(通常整个DOM必须装入内存)。XPath依赖于这个DOM

    SAX通常是人们用来提高速度或处理不适合内存的大型文档的工具。它更受事件驱动:它会通知您开始元素、结束元素等,您可以编写处理程序来对它们作出反应。这有点痛苦,因为你最终会跟踪自己的状态(例如,哪些元素你“在里面”)

    有一个中间立场:一些解析器具有“拉解析”功能,您可以使用类似光标的导航。您仍然可以按顺序访问每个节点,但可以“快进”到您不感兴趣的元素的末尾。它具有SAX的速度,但是对于许多用途来说,它的接口更好。我不知道Nokogiri是否可以为HTML做这件事,但如果你感兴趣的话,我会研究它


    请注意,Nokogiri对格式错误的标记(如现实世界的HTML)也非常宽容,这本身就使得它成为HTML解析的一个非常好的选择。

    查看Ox gem。它比LibXML和Nokogiri更快,并且支持内存解析和SAX回调解析。完全公开,我写的



    在性能比较中,比较了DOM(内存中)和SAX(回调)解析器。

    显示了到Ox的链接。关于性能差异的讨论:

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

    nokogiri是目前最快的gem我发现ox比nokogiriHm好,你想添加一个链接吗?我用过ox,我对它很满意()我在哪里可以有更多关于使用类似节点的文档,ox gem中的cdata?Mansoor,只需快速查看源代码。我移植了一个Java程序(使用JAXP)在相同的文件上,Ruby版本的速度是Ruby 2.0的4-5倍,并且获取cdata的代码要简单得多(不需要词法分析器)。结果给我留下了深刻的印象。我建议你合并你的两个用户帐户(它们被称为相同的?!?)和你的两个答案。nokogiri并不像预期的那么快。现在我在解析大型XML文件时遇到了一个问题。我不知道文件中有多少条记录,但文件大小是7.2mb。所以当我试图解析时,nokogiri挂断了电话。我对这种能力很感兴趣。“快进”到一个你不感兴趣的元素的结尾,Nokogiri SAX有这样的功能吗?@HarryWood SAX作为一个API,是你能得到的最普通的东西。不过,请查看gem,它在引擎盖下使用SAX,基本上会快速前进到您正在寻找的元素,并在那里枚举项目。