2012-04-15 58 views
3

我正在使用Last.fm API,並試圖獲取關於某個用戶的大量信息並以xml格式返回。所以,這裏是我認爲呼叫:如何將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 

這樣一來,我在正確返回由get_info_url返回的XML。但是,我想將xml加入由get_friends_url返回的xml。我會怎麼做呢?

繼Ben Miller的回答之後,我在回調中收到一個parserror。我認爲這與兩個包含xml version的xml文件有關。也許組合文件不?我看到的是,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> 

回答

3

一個選擇它,因此兩個XML對象轉換爲字符串和Concat的他們,然後在新的根節點包裹。

或者你可以用引入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 
+0

我越來越近做到這一點!但是這仍然不是。看到我編輯的答案! – Ashitaka 2012-04-15 16:22:09

+0

我更新了代碼示例。問題在於我們連接了完整的XML。我們只需要選擇你想要的節點。 – 2012-04-15 16:26:40

+0

它的工作!雖然你有一個錯字。你有兩次'info_xml',第二次應該是'friends_xml'。無論如何,如果你能回答最後一個問題。 'at_xpath'和'xpath'有什麼不同?他們似乎可以互換。 – Ashitaka 2012-04-15 16:40:19

相關問題