2016-01-31 39 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