首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于2.4MB的XML文件,您会推荐哪个Ruby XML库?

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

Stack Overflow用户
提问于 2008-09-24 10:10:26
回答 2查看 4.4K关注 0票数 16

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

我知道以下几点(没有特别的顺序):

我更喜欢打包成Ruby gem的东西,我怀疑Chilkat库不是这样的。

性能并不是一个主要问题--我不认为这件事需要每天运行一次以上(每周运行一次的可能性更大)。我更感兴趣的是与XML相关的任何东西一样易于使用的东西。

编辑:我尝试了一下gemified的:

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

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project xmlns="http://schemas.microsoft.com/project">
    <SaveVersion>12</SaveVersion>
</Project>

如下所示:

代码语言:javascript
复制
doc = Hpricot.XML(open('test.xml'))
version = (doc/:Project/:SaveVersion).first.inner_html

hpricot似乎相对不关心名称空间,在本例中这是很好的:只有一个,但对于复杂的文档可能会有问题。由于hpricot也非常慢,我认为这将是一个可以自行解决的问题。

libxml-ruby速度快了一个数量级,理解名称空间(我花了几个小时才弄明白),而且更接近于XML metal - XPath查询和其他所有东西。如果像我一样,只有在极端胁迫的情况下才打开XML文档,那么这不一定是一件好事。helper模块在提供如何有效处理默认名称空间的示例方面最有帮助。这就是我最终得到的结论(我不会以任何方式断言它的美观、正确性或其他价值,它只是我现在所在的地方):

代码语言:javascript
复制
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的纯粹风格的为什么的代码。

稍晚再编辑一次:我发现了HappyMapper ('gem install happymapper'),它非常有前途,如果还处于早期阶段的话。它是声明性的,而且大部分都是有效的,尽管我发现了一些还没有修复的边缘情况。它可以让你做这样的事情,解析我的Google Reader OPML:

代码语言:javascript
复制
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)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-09-28 21:05:31

Hpricot可能是最适合你的工具--它很容易使用,处理2 2mg的文件应该没有问题。

Speedwise libxml应该是最好的。几个月前我对python使用了libxml2绑定(那时rb-libxml已经过时了)。流媒体接口最适合我( ruby gem中的LibXML::XML::Reader)。它允许在下载时处理文件,比SAX更友好,允许我在一分钟多一点的时间内将数据从互联网上的30mb xml文件加载到MySQL数据库中。

票数 3
EN

Stack Overflow用户

发布于 2009-09-18 11:40:52

Nokogiri用一个干净的Rubyish API包装了libxml2和libxslt,该API支持名称空间、XPath和CSS3查询。速度也很快。http://nokogiri.org/

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/126337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档