2012-02-28 49 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.xpath'替换'xml.search'时会发生什么? – ScottJShea 2012-02-28 18:43:47

回答

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 2013-06-05 11:24:19

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