通过与Savon的SOAP调用,与Nokogiri一起阅读回复

我和萨文打了一个肥皂电话。 这很好,并给出以下响应:

     string string     

现在我想从响应中取出所有字符串元素。 但我无法让它发挥作用。

 def query(params=nil) client = Savon::Client.new do wsdl.document = "http://www.kirupafx.com/WebService/TopMovies.asmx?wsdl" end response = client.request :get_top10 if response.success? xml = Nokogiri::XML(response.to_xml) print "Until here oké!" xml.search('//GetTop10Result').each do |result| print "How are you Ruby?" @result[result.at('string').inner_text] = result.at('string').inner_text end else raise "Error!" end 

但是他从来没有打印过我漂亮的“你是ruby怎么样?” 有人能帮助我吗? 我做错了什么?

你可以这样,但这不是处理这样的问题的最好方法! 您可能有使用Nokogiri和XML的经验,但它更容易使用.to_hash这样。

 def query client = Savon::Client.new do wsdl.document = "http://www.kirupafx.com/WebService/TopMovies.asmx?wsdl" end response = client.request(:get_top10) response.to_hash[:get_top10_response][:get_top10_result] if response.success? false end 

谢谢你们的反应! 我想通了。 这是我的代码:

 # Prepare SOAP-request client = Savon::Client.new do wsdl.document = "http://www.kirupafx.com/WebService/TopMovies.asmx?wsdl" end # Execute SOAP-request response = client.request :get_top10 if response.success? names = Array.new(10) index = 0 hash = response.to_hash[:get_top10_response][:get_top10_result][:string] hash.each do |value| names[index] = value index += 1 end @result = { "0"=>{"name"=>"#{names.at(0)}"}, "1"=>{"name"=>"#{names.at(1)}"}, "2"=>{"name"=>"#{names.at(2)}"}, "3"=>{"name"=>"#{names.at(3)}"}, "4"=>{"name"=>"#{names.at(4)}"}, "5"=>{"name"=>"#{names.at(5)}"}, "6"=>{"name"=>"#{names.at(6)}"}, "7"=>{"name"=>"#{names.at(7)}"}, "8"=>{"name"=>"#{names.at(8)}"}, "9"=>{"name"=>"#{names.at(9)}"} } else raise "Error occurred during the request to the top 10 movies!" end