Какую библиотеку Ruby XML вы бы порекомендовали для файла размером 2,4 МБ?

У меня есть 2,4 МБ XML-файл, экспорт из Microsoft Project (эй, ям жертва здесь!), из которой меня просят извлечь некоторые детали для повторного представления. Не обращая внимания на интеллект или иные аспекты запроса, какую библиотеку мне следует сначала попробовать с точки зрения Ruby?

Я знаю следующее (в произвольном порядке):

REXMLБиблиотека Chilkat Ruby XMLhpricot XMLlibXMLI»

я предпочел бы что-то упакованное как драгоценный камень Ruby, который, я подозреваю, не является библиотекой Chilkat.

Производительность нене главная проблема - я неНе ожидайте, что вещь должна запускаться чаще, чем раз в день (более вероятно, раз в неделю). Я'меня больше интересует то, чтоЭто так же просто, как и все, что связано с XML.

РЕДАКТИРОВАТЬ: Я попробовал драгоценные из них:

hpricot, на милю страны, самый легкий. Например, чтобы извлечь содержимое тега SaveVersion в этот XML-файл (сохраненный в файле с именем, скажем, '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 '), что очень многообещающе, хотя все еще на ранней стадии. Это'с декларативным и в основном работает, хотя я заметил несколько крайних случаев, которые я непока нет исправлений. Это позволяет вам делать такие вещи, которые анализирует мой Google Reader 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)

Я уже люблю это, хотя этоеще не идеально.

Ответы на вопрос(2)

Ваш ответ на вопрос