我有一个2.4 MB的XML文件,是从Microsoft Project导出的(嘿,我是这里的受害者!),我被要求从中提取某些详细信息,以便重新演示。忽略请求的智能性或其他方面,从Ruby的角度来看,我应该首先尝试哪个库
我知道以下情况(无特定顺序):
- 雷克斯米尔
- Chilkat Ruby XML库
- hpricotxml
- libXML
我更喜欢包装成Ruby gem的东西,我怀疑Chilkat库不是这样的
性能不是一个主要问题-我不认为这件事需要每天运行一次以上(更可能是一周一次)。我更感兴趣的是一些与XML相关的东西一样易于使用
编辑:我试过双子座的:
从一个国家的角度来看,hpricot是最容易的。例如,提取此XML中SaveVersion标记的内容(保存在名为“test.XML”的文件中)
<;?xml version=“1.0”encoding=“UTF-8”standalone=“是”?>;
<;项目xmlns=”http://schemas.microsoft.com/project“>;
<;保存版本>;12</保存版本>;
</项目>;
采取如下措施:
doc=Hpricot.XML(打开('test.XML'))
version=(doc/:Project/:SaveVersion).first.inner\u html
hpricot似乎相对不关心名称空间,在本例中这很好:只有一个名称空间,但复杂文档可能会出现问题。由于hpricot的速度也很慢,我宁愿想象这将是一个自行解决的问题
libxmlruby的速度快了一个数量级,能够理解名称空间(我花了好几个小时才弄明白这一点),并且与xmlmetal-XPath查询和所有其他内容都非常接近。如果像我一样,只在极端胁迫的情况下打开XML文档,那么这不一定是一件好事。helper模块在提供如何有效处理默认名称空间的示例方面非常有用。这大概就是我最终得到的结果(我并没有以任何方式断言它的美丽、正确或其他价值,这正是我现在所处的位置):
xml\u parser=xml::parser.new
xml_parser.string=File.read(路径)
doc=xml\u parser.parse
@root=doc.root
@作用域={:in_node=>;'',:in_root=>;'/',:in_doc=>;'/'}
@ns_前缀='p'
@ns=“#{@ns_prefix}:#{@root.namespace[0].href}”
[email protected]_first(xpath_qry(“Project/SaveVersion”),在_根目录中,@ns.content.to_i
def xpath_qry(标记,作用域=:in_节点)
“{@scopes[scope]}”+tags.split(/\/).collect{{tag}”{{@ns_prefix}:{tag}.join('/'))
终止
我仍然在争论其利弊:libxml的极端严格性,hpricot的代码风格
稍后再编辑:我发现了HappyMapper(“gem安装HappyMapper”),这是一个非常有前途的工具,尽管它还处于早期阶段。它是声明性的,大部分是有效的,尽管我已经发现了一些我还没有修复的边缘案例。它可以让你做这样的事情,解析我的谷歌阅读器OPML:
模块OPML
课程大纲
包括HappyMapper
标记“大纲”
属性:标题,字符串
属性:文本,字符串
属性:类型,字符串
属性:xmlUrl,字符串
属性:htmlUrl,字符串
有很多:提纲,提纲
终止
终止
xml_string=File.read(“googlereader subscriptions.xml”)
sections=OPML::Outline.parse(xml_字符串)
我已经喜欢它了,尽管它还不完美
Nokogiri使用干净的Rubyish API包装libxml2和libxslt,该API支持名称空间、XPath和CSS3查询。也很快。
http://nokogiri.org/