0

私はこの問題を抱えています、そこで私は取得し続けます

TypeError: can't convert String into Integer

これは、私がこの@dataオブジェクトを調べているところです。

これが@dataオブジェクトです

@data = HTTParty.get("")

{
"body"=>{
    "predictions"=>{
        "direction"=>{
            "prediction"=>[
                {
                    "epochTime"=>"1362931090892",
                },
                {
                    "epochTime"=>"1362931747892",

                },
                {
                    "epochTime"=>"1362932467892",

                },
                {
                    "epochTime"=>"1362933187892",

                },
                {
                    "epochTime"=>"1362933847892",

                }
            ],
            "title"=>"xxxx"
        },
        "a"=>"xx",
        "b"=>"x"
    },
    "name"=>"some"
}

}

上記を通過する私のコードは

  <%  if @data["body"]["predictions"].present? %>
  <% @data["body"]["predictions"].each do |p| %>
        <%p["direction"].each do |d|%>
            <% d["prediction"].each do |k|%>
              <h4><%= k["epchoTime.."] %> </h4>
            <%end%>
        <%end%>
      <%end%>
<%end%>

これをどのように実行するかわかりません。これは、C++のようにname[integer]値を使用してアクセスする必要があるためだと思いますが、["name"]を使用したいと思います。コードを機能させるにはどうすればよいですか?

貴重な時間とご配慮に感謝いたします。

4

4 に答える 4

1

Nokogiriを使用して、生のXMLを解析する例を次に示します。

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<body>
  <predictions>
    <direction>
      <prediction>
        <epochTime>1362931090892</epochTime>
        <epochTime>1362931747892</epochTime>
        <epochTime>1362932467892</epochTime>
        <epochTime>1362933187892</epochTime>
        <epochTime>1362933847892</epochTime>
      </prediction>
      <title">xxxx</title>
      <a>"xx"</a>
      <b>"x"</b>
      <name>"some"</name>
    </direction>
  </predictions>
</body>
EOT

epoch_times = doc.search('epochTime').map(&:text)

これは値の配列を返しepochTimeます:

[
    [0] "1362931090892",
    [1] "1362931747892",
    [2] "1362932467892",
    [3] "1362933187892",
    [4] "1362933847892"
]

predictionブロックを含むすべてのブロックをループする必要がある場合がありepochTimeます。これはそれを行います:

epoch_times = doc.search('prediction').map{ |predict|
  predict.search('epochTime').map(&:text)
}

[
    [0] [
        [0] "1362931090892",
        [1] "1362931747892",
        [2] "1362932467892",
        [3] "1362933187892",
        [4] "1362933847892"
    ]
]

特定のノードを見つけて、その中の特定のタイプのすべての要素を取得する必要がある場合があります。

doc = Nokogiri::XML(<<EOT)
<body>
  <predictions>
    <direction>
      <prediction id="1">
        <epochTime>1362931090892</epochTime>
        <epochTime>1362931747892</epochTime>
        <epochTime>1362932467892</epochTime>
        <epochTime>1362933187892</epochTime>
        <epochTime>1362933847892</epochTime>
      </prediction>
      <title">xxxx</title>
      <a>"xx"</a>
      <b>"x"</b>
      <name>"some"</name>
    </direction>
  </predictions>
</body>
EOT

epoch_times = doc.search('prediction[id="1"]').map{ |predict| predict.search('epochTime').map(&:text) }

[
    [0] [
        [0] "1362931090892",
        [1] "1362931747892",
        [2] "1362932467892",
        [3] "1362933187892",
        [4] "1362933847892"
    ]
]
于 2013-03-10T21:52:52.707 に答える
0

ネストされた値がないキーを無視しているようtitleですsayand a、。b

        "title"=>"xxxx"
    },
    "a"=>"xx",
    "b"=>"x"
},

最終的なコードは次のようになります

if @data["body"]["predictions"].present? 
 @data["body"]["predictions"].each do |p|
  p.each do |d|
   if d.kind_of? Hash
    d.each do |k| 
     if k.kind_of? Array
      k.each do |x|
        if x.kind_of? Array
          x.each do |y|
            if y.kind_of? Hash
              puts y["epochTime"]
            end
          end
        end
      end 
    end
    end
   end
  end
 end
end

上記のコードは醜いですが、あなたはC ++プログラマーです、あなたはそれが好きかもしれません:P

于 2013-03-10T20:26:54.997 に答える
0

Tin Manは、このロジックをビューの外に保つことについて良い点を持っており、モデルの作品である必要があります。ただし、これはよりクリーンなビューです。

<% @data['body']['predictions']['direction']['prediction'].each do |x| %>
  <% x.each do |k, v| %>
    <h4><%= v %></h4>
  <% end %>
<% end %>
于 2013-03-10T19:07:50.527 に答える
0

私は常にそれぞれの存在を検出してループしているため、ハッシュ全体が手に負えなくなっていたので、Tin manが提案したように、XML'nokogiri'を使用し、.cssメソッドを使用してそれが存在してループしているかどうかを検出しました。元の応答はxmlであったため。

  @doc.css('predictions').each do |predictions_node| 
        predictions_node.css('direction').each do |direction_node| 
          direction_node.css('prediction').each do |prediction|
            // stuff here 

お手数をおかけしますが、よろしくお願いいたします。

于 2013-03-10T21:43:21.637 に答える