Ruby 使用SAVON response.to_散列转换方法解析SOAP响应

Ruby 使用SAVON response.to_散列转换方法解析SOAP响应,ruby,soap,savon,Ruby,Soap,Savon,我在解析SOAP响应时遇到问题 这是我的密码: require 'rubygems' require 'savon' client = Savon::Client.new "http://1.2.3.4/xyz/abcd/fsds.wsdl" res = client.query_unpaid_assesments do |soap,wsse| soap.namespaces["xmlns:SOAP-ENV"] = "http://schemas.xmlsoap.org/soap/env

我在解析SOAP响应时遇到问题

这是我的密码:

require 'rubygems'
require 'savon'

client = Savon::Client.new "http://1.2.3.4/xyz/abcd/fsds.wsdl"

res = client.query_unpaid_assesments do |soap,wsse|
  soap.namespaces["xmlns:SOAP-ENV"] = "http://schemas.xmlsoap.org/soap/envelope/"
  soap.namespaces["xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance"
  soap.namespaces["xmlns:xsd"] = "http://www.w3.org/2001/XMLSchema"

  wsse.username="xyz"
  wsse.password="123"

  soap.body = {:orderNumber => 111222333 }
end

response = Savon::Response#to_hash
hres = response.to_hash 
all_data = hres[:response][:asses_data][:date][:amount][:assesReference][:year][:cusOffCode][:serie][:number][:date][:time]
以下是我遇到的错误:

Savon::Response:Class(NoMethodError)的未定义散列方法

“res”给了我xml响应,我希望在散列中得到它

我阅读了前面的相关问题,他们建议使用response.to_hash,我这样做了,并且抛出了上面指定的错误。 如何消除此错误并将响应放入哈希中

谢谢你的帮助

我忘记发布我要解析的xml响应的主体:

<soapenv:Body>
<response>
<ns203:assesData xmlns:ns203="http://asdfsd.sdfsd.zbc.org">
<ns203:date>2010-09-01</ns203:date>
<ns203:amount>34400</ns203:amount>
<ns203:asesReference>
    <ns203:year>2010</ns203:year>
    <ns203:cusOffCode>098</ns203:customsOfficeCode>
    <ns203:serie>F</ns203:serie>
    <ns203:number>524332</ns203:number>
    <ns203:date>2010-11-11</ns203:date>
    <ns203:time>10:11:103</ns203:time>
</ns203:assesReference>
</ns203:assesData>
</response>
</soapenv:Body>

2010-09-01
34400
2010
098
F
524332
2010-11-11
10:11:103

我认为您需要尝试将返回的Savon::Response对象本身,而不是Savon::Response类,进行散列

因此
hres=res.to_hash
应该可以工作

我发现的一个例子(在这里的结尾:)应该给你这个想法

class SavonBankCode
  def self.zip_code(bank_code)
    client = Savon::Client.new Shootout.endpoints[:bank_code][:uri]
    response = client.get_bank { |soap| soap.body = { "wsdl:blz" => bank_code } }
    response.to_hash[:get_bank_response][:details][:plz]
  end
end
另一种方法是使用Nokogiri或类似工具解析结果,这意味着您可以执行以下操作:

require 'nokogiri'
response = res.xpath("//ns203:assesData", "ns203" => "http://asdfsd.sdfsd.zbc.org")
date = response.xpath("ns203:date", "ns203" => "http://asdfsd.sdfsd.zbc.org")
amount = response.xpath("ns203:amount", "ns203" => "http://asdfsd.sdfsd.zbc.org")
number = response.xpath("ns203:asesReference/ns203:number", "ns203" => "http://asdfsd.sdfsd.zbc.org")
等。等。当然像罪恶一样丑陋,但嘿,这是一个(未经测试或精炼的)替代品;)


祝你好运

您也可以尝试
response.body
。 它返回一个散列