我正在使用Nokogiri gem来解析XML数据,但是在选择性地获取我想要的数据时遇到问题。
这是我的控制器代码:
def matches
f = File.open("england.xml")
doc = Nokogiri::XML(f)
@away = doc.xpath("//league/match/odds/type[@name='1x2']/bookmaker[@id='821']")
@homeaway = doc.xpath("//league/match/odds/type[@name='Home/Away']/bookmaker[@id='781']")
@overunder = doc.xpath("//league/match/odds/type[@name='Over/Under']/bookmaker[@id='781']")
@handicap = doc.xpath("//league/match/odds/type[@name='Handicap']/bookmaker[@id='781']")
这是我有问题的XML提要的一部分:
<league>
<match>
<odds>
<type name="Handicap">
<bookmaker id="781" name="Bet365">
<handicap name="-1.75">
<odd name="1" value="2.15">
</handicap>
<handicap name="+1.75">
<odd name="2" value="1.68">
</handicap>
<handicap name="-1.50">
<odd name="1" value="1.95">
</handicap>
<handicap name="+1.50">
<odd name="2" value="1.95">
</handicap>
</bookmaker>
</type>
</odds>
</match>
</league>
这是我的观点:
<table id="tableID">
<td>Home
<td>Away</td>
<td></td>
<td></td>
</td>
<% @handicap.each do |k| %>
<tr>
<td><%= k.parent.parent.parent.children.attr("name") %></td>
<td><%= k.parent.parent.parent.children[1].attr("name") %></td>
<td><%= k.children[2].attr("name") %> | <%= k.children[2].children.attr("value") %></td>
<td> <%= k.children[3].attr("name") %> | <%= k.children[3].children.attr("value") %></td>
</tr>
<% end %>
</table>
假设有相当多的障碍,我想总是显示最接近2.00的障碍奇数值,我该怎么做?请帮助。谢谢!
下面是一些将从XML中提取值的代码。您必须弄清楚如何确定数组中最接近目标的条目:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<league>
<match>
<odds>
<type name="Handicap">
<bookmaker id="781" name="Bet365">
<handicap name="-1.75">
<odd name="1" value="2.15">
</handicap>
<handicap name="+1.75">
<odd name="2" value="1.68">
</handicap>
<handicap name="-1.50">
<odd name="1" value="1.95">
</handicap>
<handicap name="+1.50">
<odd name="2" value="1.95">
</handicap>
</bookmaker>
</type>
</odds>
</match>
</league>
EOT
handicap_odd = doc.search('type bookmaker[id="781"] handicap').map{ |handicap|
odd = handicap.at('odd')
[
handicap['name'],
odd['name'],
odd['value'].to_f
]
}
运行后,handicap_odd
包含handicap
名称和相关odd
值的数组:
handicap_odd
# => [["-1.75", "1", 2.15],
# ["+1.75", "2", 1.68],
# ["-1.50", "1", 1.95],
# ["+1.50", "2", 1.95]]
你需要弄清楚search
和at
做什么,为什么它们不同。
注意,我使用CSS而不是XPath作为选择器,这是为了可读性。