2016-01-31 120 views
0

我試圖解析以下XML:解析XML消息

<marketstat><type id="18"> 
     <buy><volume>33000000</volume><avg>40.53</avg><max>65.57</max><min>6.55</min><stddev>26.61</stddev><median>58.56</median><percentile>65.57</percentile></buy> 
     <sell><volume>494489</volume><avg>69.47</avg><max>69.47</max><min>69.47</min><stddev>0.00</stddev><median>69.47</median><percentile>69.47</percentile></sell> 
     <all><volume>33494489</volume><avg>40.96</avg><max>69.47</max><min>6.55</min><stddev>26.77</stddev><median>58.56</median><percentile>6.55</percentile></all> 
    </type><type id="19"> 
     <buy><volume>270000</volume><avg>1707.31</avg><max>3549.38</max><min>239.74</min><stddev>1554.26</stddev><median>239.75</median><percentile>3549.34</percentile></buy> 
     <sell><volume>48599</volume><avg>24930.45</avg><max>29869.95</max><min>5200.00</min><stddev>9875.66</stddev><median>29869.93</median><percentile>5232.20</percentile></sell> 
     <all><volume>280926</volume><avg>1957.07</avg><max>10750.00</max><min>239.74</min><stddev>3352.87</stddev><median>1874.31</median><percentile>239.74</percentile></all> 
    </type></marketstat> 
</evec_api> 

多條信息,我想要檢索的最小銷售和最大購買值,與ID相關聯,在這裏找到:<sell><min>69.47</min></sell>

我目前使用以下來獲取XML:marketData = Nokogiri::XML(open(api))

+1

你的問題是什麼?您需要向我們展示您解決問題的實際嘗試,或向我們展示您搜索過的所有地點,並解釋他們爲什麼沒有幫助。因爲你沒有向我們展示你的研究或努力。閱讀http://meta.stackoverflow.com/q/261592/128421,「[mcve]」和「[問]」。 –

回答

0

使用xpath拉出感興趣的節點,然後將它們轉換爲Float s並選取所需的值。您的最小銷售節點的路徑是/marketstat/type/sell/min,或者如果您要使用速記,//表示「文檔中的任何位置」,因此您只能指定//sell/min以獲得所有最小銷售節點和//buy/max以獲得所有最大購買。

sells = market_data.xpath('//sell/min').map(&:content).map(&:to_f) 
buys = market_data.xpath('//buy/max').map(&:content).map(&:to_f) 

puts sells.min, buys.max 
+0

這兩個答案的混合是我需要的。謝謝。 – lykam

0

下將打印ID及其相應的最小/最大:

marketData = Nokogiri::XML(open(api)) 
marketData.xpath("//type").each do |i| 
    puts "#{i.attr('id')}: #{i.xpath('.//max').map {|j| j.text.to_f}.max}" 
    puts "#{i.attr('id')}: #{i.xpath('.//min').map {|j| j.text.to_f}.min}" 
end 

輸出:

18: 69.47 
18: 6.55 
19: 29869.95 
19: 239.74 
+0

這兩個答案的混合是我需要的。謝謝。 – lykam