3

XML形式のストーリーのコレクションがあります。ファイルを解析し、各ストーリーをハッシュまたはRubyオブジェクトとして返し、Rubyスクリプト内でデータをさらに操作できるようにします。

Nokogiriはこれをサポートしていますかそれとも使用するためのより良いツール/ライブラリがありますか?

XMLドキュメントの構造は次のとおりで、Pivo​​talTrackerのWebAPIを介して返されます。

<?xml version="1.0" encoding="UTF-8"?>
<stories type="array" count="145" total="145">
  <story>
    <id type="integer">16376</id>
    <story_type>feature</story_type>
    <url>http://www.pivotaltracker.com/story/show/16376</url>
    <estimate type="integer">2</estimate>
    <current_state>accepted</current_state>
    <description>A description</description>
    <name>Receivable index listing will allow selection viewing</name>
    <requested_by>Tony Superman</requested_by>
    <owned_by>Tony Superman</owned_by>
    <created_at type="datetime">2009/11/04 15:49:43 WST</created_at>
    <accepted_at type="datetime">2009/11/10 11:06:16 WST</accepted_at>
    <labels>index ui,receivables</labels>
  </story>
  <story>
    <id type="integer">17427</id>
    <story_type>feature</story_type>
    <url>http://www.pivotaltracker.com/story/show/17427</url>
    <estimate type="integer">3</estimate>
    <current_state>unscheduled</current_state>
    <description></description>
    <name>Validations in wizards based on direction</name>
    <requested_by>Matthew McBoggle</requested_by>
    <created_at type="datetime">2009/11/17 15:52:06 WST</created_at>
  </story>
  <story>
    <id type="integer">17426</id>
    <story_type>feature</story_type>
    <url>http://www.pivotaltracker.com/story/show/17426</url>
    <estimate type="integer">2</estimate>
    <current_state>unscheduled</current_state>
    <description>Manual payment needs a description field.</description>
    <name>Add description to manual payment</name>
    <requested_by>Tony Superman</requested_by>
    <created_at type="datetime">2009/11/17 15:10:41 WST</created_at>
    <labels>payment process</labels>
  </story>
  <story>
    <id type="integer">17636</id>
    <story_type>feature</story_type>
    <url>http://www.pivotaltracker.com/story/show/17636</url>
    <estimate type="integer">3</estimate>
    <current_state>unscheduled</current_state>
    <description>The SMS and email templates needs to be editable by merchants.</description>
    <name>Notifications are editable by the merchant</name>
    <requested_by>Matthew McBoggle</requested_by>
    <created_at type="datetime">2009/11/19 16:44:08 WST</created_at>
  </story>
</stories>
4

5 に答える 5

6

ActiveSupportのハッシュ拡張機能を活用できます。次に、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'] }

これにより、ハッシュの配列(ストーリーノードごとに1つ)が生成され、以下に示すように、属性に基づいて入力が保持されます。

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
于 2009-11-30T03:53:18.253 に答える
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属性を無視しますが、とにかくそれらをどうするかについては述べていません...;)

于 2009-11-23T10:29:30.803 に答える
1

私はあなたがこの答えに固執することができると思います。

より簡単なものはここにあります。

于 2009-11-23T03:32:41.050 に答える
1

このxmlは、RailsのActiveRecord#to_xmlメソッドによって生成されます。レールを使用している場合は、Hash#from_xmlを使用して解析できるはずです。

于 2009-11-23T03:38:30.553 に答える
0

たぶん、Pivo​​tal APIへのRubyインターフェースは、タスクのより良いソリューションになる可能性があります。https://github.com/jsmestad/pivotal-trackerを参照してください...次に、(ドキュメントから)次のようなプレーンなRubyオブジェクトとしてストーリーを取得できます。

@a_project = PivotalTracker::Project.find(84739)                              
@a_project.stories.all(:label => 'overdue', :story_type => ['bug', 'chore'])
于 2011-07-18T09:54:55.740 に答える