Подтвердить что ты не робот

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

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

Мне известно следующее (без особого порядка):

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

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

ИЗМЕНИТЬ: Я попробовал искушенные:

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

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 кода.

EDIT снова, несколько позже: я обнаружил 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)

Мне это уже нравится, хотя он еще не идеален.

4b9b3361

Ответ 1

Hpricot, вероятно, лучший инструмент для вас - он прост в использовании и должен обрабатывать 2mg файл без проблем.

Speedwise libxml должен быть лучшим. Я использовал привязку libxml2 для python несколько месяцев назад (в этот момент rb-libxml был устаревшим). Потоковый интерфейс работал лучше для меня (LibXML:: XML:: Reader в рубиновой жемчужине). Он позволяет обрабатывать файл во время его загрузки, немного более дружелюбен, чем SAX, и позволяет мне загружать данные из файла размером 30 МБ из Интернета в базу данных MySQL чуть более минуты.

Ответ 2

Nokogiri обертывает libxml2 и libxslt с помощью чистого API Rubyish, который поддерживает пространства имен, запросы XPath и CSS3. Быстро, тоже. http://nokogiri.org/