3

私は Last.fm API を使用しており、特定のユーザーに関する多くの情報を取得して xml で返そうとしています。だから、ここに私の見解での呼び出しがあります:

<%= form_tag fetch_user_path, :remote => true, :'data-type' => 'xml', :id => 'search' do %>
  <%= text_field_tag :q %>
<% end %>

ご覧のとおり、XML を想定しており、jQuery を使用してコールバックを正しく処理しています。次に、私のコントローラーで:

# fetch_controller.rb
def user
  username = params[:q].gsub(' ','+')
  get_info_url = "http://ws.audioscrobbler.com/2.0/?method=user.getinfo&user=#{username}&api_key=#{API_KEY}"
  get_friends_url = "http://ws.audioscrobbler.com/2.0/?method=user.getfriends&user=#{username}&api_key=#{API_KEY}"

  respond_to do |format|
    format.xml {
      begin
        @info = Nokogiri::XML(open(get_info_url))
        @friends = Nokogiri::XML(open(get_friends_url))
      rescue Exception => e
        if e.message == '400 Bad Request'
          render xml: { :error => 'User not found.' }, :status => 400
        else
          render xml: { :error => 'Connection to Last.fm failed.' }, :status => 500
        end
      else
        # Here, I want to render @info + @friends!
        render xml: @info
      end
    }
end

このようにして、によって返された xml を正しく返していget_info_urlます。ただし、その xml を によって返される xml に結合したいと考えていget_friends_urlます。どうすればそれについて行くでしょうか?

Ben Miller の回答に続いて、コールバックで解析エラーが発生しています。を含む両方のxmlファイルに関係していると思いますxml version。そして、おそらく結合されたファイルはそうではありませんか?xml ファイルが連結されているのがわかりますconsole.log

Error: Invalid XML: <?xml version="1.0"?>
<Combined>
  <UserInfo>
    <?xml version="1.0" encoding="utf-8"??>
    <lfm status="ok">
      <user>
        # lots of info about the user
      </user>
    </lfm>
  </UserInfo>
  <FriendInfo>
    <?xml version="1.0" encoding="utf-8"??>
      <lfm status="ok">
        <friends for="user" page="1" perpage="50" totalpages="2" total="96">
          # lots of info about the user's friends
        </friends>
      </lfm>
  </FriendInfo>
</Combined>
4

1 に答える 1

4

1 つのオプションは、2 つの XML オブジェクトを文字列に変換して連結し、新しいルート ノードにラップします。

または、Nokogiriビルダーでそれを行うことができます

def user
  username = params[:q].gsub(' ','+')
  get_info_url = "http://ws.audioscrobbler.com/2.0/?method=user.getinfo&user=#{username}&api_key=#{API_KEY}"
  get_friends_url = "http://ws.audioscrobbler.com/2.0/?method=user.getfriends&user=#{username}&api_key=#{API_KEY}"

  respond_to do |format|
    format.xml {
      begin
        info_xml = Nokogiri::XML(open(get_info_url))
        friends_xml = Nokogiri::XML(open(get_friends_url))
        builder = Nokogiri::XML::Builder.new do |xml_out|
          xml_out.Combined {
            xml_out.UserInfo {
              node = info_xml.at_xpath("//user")
              xml_out << node.to_xml.to_str
            }
            xml_out.FriendInfo {
              node = friends_xml.at_xpath("//friends")
              xml_out << node.to_xml.to_str
            }
          }
        end
      rescue Exception => e
        if e.message == '400 Bad Request'
          render xml: { :error => 'User not found.' }, :status => 400
        else
          render xml: { :error => 'Connection to Last.fm failed.' }, :status => 500
        end
      else
        render xml: builder.to_xml
      end
    }
  end
end
于 2012-04-15T15:41:50.390 に答える