2011-01-27 52 views
3

我使用的ActiveResource消耗由管理平臺提供的REST Web服務(一個bug跟蹤工具)。這webservice的類似下面生成XML:我怎樣才能使的ActiveResource XML解析更穩定?

<custom_field name="Issue Owner" id="15">Fred Fake</custom_field> 
<custom_field name="Needs Printing" id="16">0</custom_field> 
<custom_field name="Review Assignee" id="17">Fran Fraud</custom_field> 
<custom_field name="Released On" id="20"></custom_field> 
<custom_field name="Client Facing" id="21">0</custom_field> 
<custom_field name="Type" id="22">Bug</custom_field> 
<custom_field name="QA Assignee" id="23"></custom_field> 
<custom_field name="Company Name" id="26"></custom_field> 
<custom_field name="QA Notes" id="27"></custom_field> 
<custom_field name="Failed QA Attempts" id="28">2</custom_field> 

然而,當的ActiveResource分析這個問題,我遍歷這些結果打印出來,我得到:

Fred Fake 
0 
Fran Fraud 
#<Redmine::Issue::CustomFields::CustomField:0x5704e95d> 
0 
Bug 
#<Redmine::Issue::CustomFields::CustomField:0x32fd963> 
#<Redmine::Issue::CustomFields::CustomField:0x3a68f437> 
#<Redmine::Issue::CustomFields::CustomField:0x407964d6> 
2 

這是正確的,它拋出了所有的來自任何具有值的屬性信息,但保留來自空元素的屬性信息。

不用說,這使得當你試圖找到ID 15(或其他)的有價值的東西相當困難。現在我可以通過他們的位置來引用事情,但這非常脆弱,因爲這些元素將來可能會發生變化。我認爲必須有一些方法讓ActiveResource保留屬性信息,但是因爲我沒有做任何特別的事情。 (我的ActiveResource擴展只有五行:它擴展了ActiveResource,定義了服務的URL,用戶名和密碼,就是這樣)。

那麼,有沒有人知道我可以如何讓ActiveResource不這麼奇怪地解析這個XML?

+0

這將是很酷,如果你可以發佈的代碼片做印刷和解析。 – karlcow 2011-02-05 13:16:38

回答

1

這是一個已知的問題明顯的ActiveResource:

https://github.com/rails/rails/issues/588

不幸的是,沒有出現關於它&問題被關閉工作要做。如果你對此感到滿意,Rails 3代碼用於更新ActiveResource和Hash.from_xml以保留所有屬性,都在下面的要點中,你可以在你的Redmine模塊中創建一個定製版本來修復它:

https://gist.github.com/971598

更新:

的替代,因爲它出現ActiveResource will not be part of Rails 4 core並作爲一個獨立的創業板將被剝離出來,將使用替代的ORM的REST API,像Her

她的允許您爲XML使用自定義分析器。這就是所謂的管理平臺:: ParseXML一個例子定製解析器:

https://gist.github.com/3879418

所以,那麼所有你需要做的是創造這樣的配置/初始化/ her.rb文件:

Her::API.setup :url => "https://api.xxxxx.org" do |connection| 
    connection.use Faraday::Request::UrlEncoded 
    connection.use Redmine::ParseXML 
    connection.use Faraday::Adapter::NetHttp 
end 

和你得到如下的哈希:

#<Redmine::Issue(issues) issues={:attributes=>{:type=>"array", :count=>1640}, 
:issue=>{:id=>4326, 
    :project=>{:attributes=>{:name=>"Redmine", :id=>1}}, 
    :tracker=>{:attributes=>{:name=>"Feature", :id=>2}}, 
    :status=>{:attributes=>{:name=>"New", :id=>1}}, 
    :priority=>{:attributes=>{:name=>"Normal", :id=>4}}, 
    :author=>{:attributes=>{:name=>"John Smith", :id=>10106}}, 
    :category=>{:attributes=>{:name=>"Email notifications", :id=>9}}, 
    :subject=>"\n  Aggregate Multiple Issue Changes for Email Notifications\n ", 
    :description=>"\n  This is not to be confused with another useful proposed feature that\n  would do digest emails for notifications.\n ", 
    :start_date=>"2009-12-03", 
    :due_date=>{}, 
    :done_ratio=>0, 
    :estimated_hours=>{}, 
    :custom_fields=>{ 
     :custom_field=>[ 
      {:attributes=>{:name=>"Issue Owner", :id=>15}, "value"=>"Fred Fake"}, 
      {:attributes=>{:name=>"Needs Printing", :id=>16}, "value"=>0}, 
      {:attributes=>{:name=>"Review Assignee", :id=>17}, "value"=>"Fran Fraud"}, 
      {:attributes=>{:name=>"Released On", :id=>20}}, 
      {:attributes=>{:name=>"Client Facing", :id=>21}, "value"=>0}, 
      {:attributes=>{:name=>"Type", :id=>22}, "value"=>"Bug"}, 
      {:attributes=>{:name=>"QA Assignee", :id=>23}}, 
      {:attributes=>{:name=>"Company Name", :id=>26}}, 
      {:attributes=>{:name=>"QA Notes", :id=>27}}, 
      {:attributes=>{:name=>"Failed QA Attempts", :id=>28}, "value"=>2}]}, 
    :created_on=>"Thu Dec 03 15:02:12 +0100 2009", 
    :updated_on=>"Sun Jan 03 12:08:41 +0100 2010"}}>