2012-02-28 4 views
5

У меня есть мыльный звонок с Савоном. Это прекрасно работает и дает следующий ответ:Прочитать ответ с помощью Nokogiri с помощью SOAP-вызова с Savon

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

Теперь я хочу взять все строковые элементы из ответа. Но Я не могу заставить его работать.

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 

Но он никогда не печатает мои красивые «Как вы, Руби»? Может кто-нибудь помочь мне? Что я делаю неправильно?

+0

Что происходит, когда вы заменяете 'xml.search'' xml.xpath'? – ScottJShea

ответ

2

Вы могли бы это сделать, но это не лучший способ справиться с такими проблемами! Возможно, у вас есть опыт использования 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 
+0

именно то, что я искал :) – Francois

0

Спасибо за обе реакции! Я понял. Вот мой код:

# 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