对于2.4MB XML文件,您会推荐哪个Ruby XML库?

我有一个2.4 MB的XML文件,从Microsoft Project导出(嘿,我是这里的受害者!),我要求我提取重新呈现的某些细节。 忽略请求的智能或其他方面,我应该首先从Ruby的角度尝试哪个库?

我知道以下内容(没有特别的顺序):

  • REXML
  • Chilkat Ruby XML库
  • hpricot XML
  • 的libxml

我更喜欢打包成Rubygem的东西,我怀疑Chilkat库不是。

性能不是一个主要问题 – 我不认为每天需要运行一次以上(每周一次更有可能)。 我对那些与XML相关的东西一样容易使用的东西更感兴趣。

编辑:我尝试了gem的:

hpricot是一个国家英里,最简单。 例如,要在此XML中提取SaveVersion标记的内容(保存在名为’test.xml’的文件中)

  12  

采取这样的事情:

 doc = Hpricot.XML(open('test.xml')) version = (doc/:Project/:SaveVersion).first.inner_html 

hpricot似乎对名称空间相对漠不关心,在这个例子中很好:只有一个,但可能是复杂文档的问题。 由于hpricot也非常慢,我宁愿想象这将是一个解决自己的问题。

libxml-ruby的速度提高了一个数量级,了解命名空间(我需要花费几个小时来解决这个问题)并且完全接近XML金属 – XPath查询和所有其他内容都在那里。 如果像我一样,只有在极端胁迫的条件下才能打开XML文档,这不一定是好事。 帮助器模块主要用于提供有效处理默认命名空间的示例。 这大致是我最终得到的结论(我不以任何方式断言它的美丽,正确性或其他价值,它就在我现在的位置):

 xml_parser = XML::Parser.new xml_parser.string = File.read(path) doc = xml_parser.parse @root = doc.root @scopes = { :in_node => '', :in_root => '/', :in_doc => '//' } @ns_prefix = 'p' @ns = "#{@ns_prefix}:#{@root.namespace[0].href}" version = @root.find_first(xpath_qry("Project/SaveVersion", :in_root), @ns).content.to_i def xpath_qry(tags, scope = :in_node) "#{@scopes[scope]}" + tags.split(/\//).collect{ |tag| "#{@ns_prefix}:#{tag}"}.join('/') end 

我仍然在争论利弊:libxml因其额外的严谨性,hpricot为纯粹的_why代码风格。

再次编辑,稍后:我发现了HappyMapper(’gem install happymapper’),如果还处于早期阶段,它是非常有前途的。 虽然我发现了一些我尚未修复的边缘情况,但它是声明性的并且大部分都有效。 它允许你做这样的事情,解析我的谷歌阅读器OPML:

 module OPML class Outline include HappyMapper tag 'outline' attribute :title, String attribute :text, String attribute :type, String attribute :xmlUrl, String attribute :htmlUrl, String has_many :outlines, Outline end end xml_string = File.read("google-reader-subscriptions.xml") sections = OPML::Outline.parse(xml_string) 

我已经喜欢它,尽管它还不完美。

Hpricot可能是最好的工具 – 它易于使用,应该可以处理2mg文件没有问题。

Speedwise libxml应该是最好的。 几个月前我用python的libxml2绑定(当时rb-libxml已经过时)。 Streaming接口对我来说是最好的(Ruby中的LibXML :: XML :: Reader)。 它允许在下载时处理文件,比SAX更加用户友好,并允许我在一分多钟的时间内将数据从30mb xml文件从Internet加载到MySQL数据库。

Nokogiri使用干净的Rubyish API包装libxml2和libxslt,该API支持命名空间,XPath和CSS3查询。 也快。 http://nokogiri.org/