Прочитать ответ с Nokogiri от SOAP-звонка с Savon - PullRequest
5 голосов
/ 28 февраля 2012

Я сделал мыльный звонок с Савоном.Это прекрасно работает и дает следующий ответ:

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

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

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

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

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

# 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 
...