gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:39:33 34 4
gpt4 key购买 nike

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

2天前关闭。




Improve this question




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

我知道以下内容(排名不分先后):

  • REXML
  • Chilkat Ruby XML library
  • hpricot XML
  • libXML

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

    性能不是主要问题 - 我不希望这件事每天需要运行多次(每周一次更有可能)。我对任何与 XML 相关的东西都易于使用的东西更感兴趣。

    编辑:我尝试了 gem 化的:

    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>

    需要这样的东西:
    doc = Hpricot.XML(open('test.xml'))
    version = (doc/:Project/:SaveVersion).first.inner_html

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

    libxml-ruby 速度快了一个数量级,理解命名空间(我花了好几个小时才弄明白这一点)并且完全更接近 XML 金属——XPath 查询和所有其他东西都在那里。如果像我一样只在极端胁迫的情况下打开 XML 文档,这不一定是一件好事。 helper 模块在提供如何有效处理默认命名空间的示例方面非常有帮助。这大致是我最终得到的结果(我并没有以任何方式断言它的美感、正确性或其他值(value),这就是我现在所处的位置):
    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)

    我已经爱上它了,尽管它还不完美。

    最佳答案

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

    关于xml - 对于 2.4MB 的 XML 文件,您会推荐哪个 Ruby XML 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/126337/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com