2012-02-28 27 views
5

Tôi đã thực hiện cuộc gọi xà phòng với Savon. Đây hoạt động tốt và cung cấp cho các phản ứng sau:Đọc phản hồi với Nokogiri từ cuộc gọi SOAP với 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> 

Bây giờ tôi muốn đưa tất cả các yếu tố chuỗi ra khỏi phản ứng. Nhưng Tôi không thể làm cho nó hoạt động.

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 

Nhưng anh ấy chưa bao giờ in đẹp "Làm thế nào bạn là Ruby?" Ai đó có thể giúp tôi không? Tôi đang làm gì sai?

+0

Điều gì sẽ xảy ra khi bạn thay thế 'xml.search' bằng' xml.xpath'? – ScottJShea

Trả lời

2

Bạn có thể làm điều này nhưng đây không phải là cách tốt nhất để giải quyết các vấn đề như thế này! Bạn có thể có kinh nghiệm sử dụng Nokogiri và XML nhưng dễ sử dụng hơn .to_hash như thế này.

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

chính xác những gì tôi đã tìm kiếm :) – Francois

0

Cảm ơn cả hai phản ứng! Tôi đã tìm ra. Đây là mã của tôi:

# 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 
Các vấn đề liên quan