Read the answer from Nokogiri on calling SOAP with Savon

I made a soap call with Savon. This works great and gives the following answer:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http:// 
schemas.xmlsoap.org/soap/envelope/"> 
  <soap:Body> 
    <GetTop10Response xmlns="http://www.kirupafx.com"> 
      <GetTop10Result> 
        <string>string</string> 
        <string>string</string> 
      </GetTop10Result> 
    </GetTop10Response> 
  </soap:Body> 
</soap:Envelope> 

Now I want to remove all line items from the response. But I can not make it work.

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

But he never prints my beautiful "How are you, Ruby?" Can someone help me? What am I doing wrong?

+5
source share
2 answers

You could do it, but this is not the best way to deal with such problems! You may have experience using Nokogiri and XML, but it’s easier to use .to_hashlike this.

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
+2
source

Thanks for both reactions! I understood. Here is my code:

# 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 
0
source

All Articles