Вопрос по hash, pivotaltracker, nokogiri, xml, ruby – Конвертировать коллекцию XML (из историй Pivotal Tracker) в хэш / объект Ruby

2

У меня есть коллекция историй в формате XML. Я хотел бы проанализировать файл и вернуть каждую историю в виде хеш-объекта или объекта Ruby, чтобы в дальнейшем можно было манипулировать данными в сценарии Ruby.

Есть лиNokogiri поддержать это, или есть лучший инструмент / библиотека для использования?

XML-документ имеет следующую структуру, возвращаемую черезPivotal Tracker 'с веб-API:



  
    16376
    feature
    http://www.pivotaltracker.com/story/show/16376
    2
    accepted
    A description
    Receivable index listing will allow selection viewing
    Tony Superman
    Tony Superman
    2009/11/04 15:49:43 WST
    2009/11/10 11:06:16 WST
    index ui,receivables
  
  
    17427
    feature
    http://www.pivotaltracker.com/story/show/17427
    3
    unscheduled
    
    Validations in wizards based on direction
    Matthew McBoggle
    2009/11/17 15:52:06 WST
  
  
    17426
    feature
    http://www.pivotaltracker.com/story/show/17426
    2
    unscheduled
    Manual payment needs a description field.
    Add description to manual payment
    Tony Superman
    2009/11/17 15:10:41 WST
    payment process
  
  
    17636
    feature
    http://www.pivotaltracker.com/story/show/17636
    3
    unscheduled
    The SMS and email templates needs to be editable by merchants.
    Notifications are editable by the merchant
    Matthew McBoggle
    2009/11/19 16:44:08 WST
  

Ваш Ответ

5   ответов
2

# str_xml contains your xml
xml = Nokogiri::XML.parse(str_xml)
xml.search('//story').to_a.map{|node| node.children.inject({}){|a,c| a[c.name] = c.text if c.class == Nokogiri::XML::Element; a}}

который возвращает массив хэшей:

>> xml.search('//story').to_a.map{|node| node.children.inject({}){|a,c| a[c.name] = c.text if c.class == Nokogiri::XML::Element; a}}
=> [{"id"=>"16376", "story_type"=>"feature", "url"=>"http://www.pivotaltracker.com/story/show/16376", "estimate"=>"2", "current_state"=>"accepted", "description"=>"A description", "name"=>"Receivable index listing will allow selection viewing", "requested_by"=>"Tony Superman", "owned_by"=>"Tony Superman", "created_at"=>"2009/11/04 15:49:43 WST", "accepted_at"=>"2009/11/10 11:06:16 WST", "labels"=>"index ui,receivables"}, {"id"=>"17427", "story_type"=>"feature", "url"=>"http://www.pivotaltracker.com/story/show/17427", "estimate"=>"3", "current_state"=>"unscheduled", "description"=>"", "name"=>"Validations in wizards based on direction", "requested_by"=>"Matthew McBoggle", "created_at"=>"2009/11/17 15:52:06 WST"}, {"id"=>"17426", "story_type"=>"feature", "url"=>"http://www.pivotaltracker.com/story/show/17426", "estimate"=>"2", "current_state"=>"unscheduled", "description"=>"Manual payment needs a description field.", "name"=>"Add description to manual payment", "requested_by"=>"Tony Superman", "created_at"=>"2009/11/17 15:10:41 WST", "labels"=>"payment process"}, {"id"=>"17636", "story_type"=>"feature", "url"=>"http://www.pivotaltracker.com/story/show/17636", "estimate"=>"3", "current_state"=>"unscheduled", "description"=>"The SMS and email templates needs to be editable by merchants.", "name"=>"Notifications are editable by the merchant", "requested_by"=>"Matthew McBoggle", "created_at"=>"2009/11/19 16:44:08 WST"}]

Тем не менее, это игнорирует все атрибуты XML, но у вас нетв любом случае я не сказал, что с ними делать.

0

Ruby-интерфейс к Pivotal API может быть лучшим решением для вашей задачи, см.https://github.com/jsmestad/pivotal-tracker ... тогда вы можете получать истории в виде простых объектов Ruby, таких как (из документов):

@a_project = PivotalTracker::Project.find(84739)                              
@a_project.stories.all(:label => 'overdue', :story_type => ['bug', 'chore'])
1

этот ответ.

Более простой можно найтиВот.

5

о просто проанализировать ваш документ в Nokogiri и затем преобразовать результат набора узлов в хеш. Этот метод сохранит типизацию атрибутов (например, целые числа, даты, массивы). (Конечно, если вывы пользуетесь Railsне нужно требовать / включать активную поддержку или nokogiri, если она есть в вашей среде. Я'м, предполагая, что реализация Ruby здесь.)

require 'rubygems'
require 'nokogiri'
require 'activesupport'

include ActiveSupport::CoreExtensions::Hash

doc = Nokogiri::XML.parse(File.read('yourdoc.xml'))
my_hash = doc.search('//story').map{ |e| Hash.from_xml(e.to_xml)['story'] }

Это создаст массив хэшей (по одному для каждого узла истории) и сохранит типизацию на основе атрибутов, как показано ниже:

my_hash.first['name']
=> "Receivable index listing will allow selection viewing"

my_hash.first['id']
=> 16376

my_hash.first['id'].class
=> Fixnum

my_hash.first['created_at'].class
=> Time
1

ьзуете rails, вы можете использовать Hash # from_xml для его анализа.

Я не использую Rails в этом случае. mlambie

Похожие вопросы