ruby on rails -用nokogiri解析XML获取我想要的数据



我正在使用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]]

你需要弄清楚searchat做什么,为什么它们不同。

注意,我使用CSS而不是XPath作为选择器,这是为了可读性。

相关内容

  • 没有找到相关文章

最新更新