我有一个2.4 MB的XML文件,从Microsoft Project导出(嘿,我是受害者!),我要求我提取重新呈现的某些细节.忽略请求的智能或其他方面,我应该首先从Ruby的角度尝试哪个库?
我知道以下内容(没有特别的顺序):
我更喜欢打包成Ruby宝石的东西,我怀疑Chilkat库不是.
性能不是一个主要问题 - 我不认为每天需要运行一次以上(每周一次更有可能).我对那些与XML相关的东西一样容易使用的东西更感兴趣.
编辑:我尝试了宝石的:
hpricot是一个国家英里,最简单.例如,要在此XML中提取SaveVersion标记的内容(保存在名为'test.xml'的文件中)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project xmlns="http://schemas.microsoft.com/project">
<SaveVersion>12</SaveVersion>
</Project>
Run Code Online (Sandbox Code Playgroud)
采取这样的事情:
doc = Hpricot.XML(open('test.xml'))
version = (doc/:Project/:SaveVersion).first.inner_html
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我仍然在争论利弊: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)
Run Code Online (Sandbox Code Playgroud)
我已经喜欢它,尽管它还不完美.
Hpricot可能是最适合您的工具——它易于使用,并且可以毫无问题地处理 2mg 文件。
Speedwise libxml 应该是最好的。几个月前,我在 python 中使用了 libxml2 绑定(当时 rb-libxml 已经过时了)。流接口对我来说效果最好(Ruby gem 中的 LibXML::XML::Reader)。它允许在下载时处理文件,比 SAX 更加用户友好,并且允许我在一分钟多一点的时间内将 30mb xml 文件中的数据从互联网加载到 MySQL 数据库。
归档时间: |
|
查看次数: |
4318 次 |
最近记录: |