2012-02-28 31 views
5

Wykonałem telekonferencję z Savon. Działa to dobrze i dać następującą odpowiedź:Przeczytaj odpowiedź w Nokogiri z połączenia SOAP z Savonem

<?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> 

teraz chcę wziąć wszystkie elementy strunowych z odpowiedzią. Ale Nie mogę go uruchomić.

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 

Ale nigdy nie drukuje mojego pięknego "Jak się masz Ruby?" Czy ktoś może mi pomóc ? Co robię źle?

+0

Co stanie się po zmianie 'xml.search' na' xml.xpath'? – ScottJShea

Odpowiedz

2

Można to zrobić, ale nie jest to najlepszy sposób radzenia sobie z takimi problemami! Możesz mieć doświadczenie w korzystaniu z Nokogiri i XML, ale jest to łatwiejsze w użyciu, takie jak to: .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 
+0

dokładnie to, czego szukałem :) – Francois

0

Dzięki za reakcje! Zorientowałem się. Oto mój kod:

# 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