2012-02-28 1 views
5

Savon과 비누 호출을했습니다. 이 잘 작동하고 다음과 같은 응답이 제공 :Savon과 SOAP 호출에서 Nokogiri의 응답 읽기

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