我使用Rails和Savon 2从SOAP Webservice获取数据。
这是代码:
client = Savon.client(wsdl: "http://www.webservicex.net/periodictable.asmx?WSDL",
log_level: :debug,
pretty_print_xml: true)
message = {'ElementName' => 'Zinc'}
response = client.call(:get_element_symbol, message: message)
logger.debug "Body=" + response.body.to_s
symbol = response.to_hash[:get_element_symbol_response][:get_element_symbol_result][:NewDataDet][:Table][:Symbol]
请求正常,我正在从响应中获取数据:
Body={:get_element_symbol_response=>{:get_element_symbol_result=>"<NewDataSet>n <Table>n <Symbol>Zn</Symbol>n </Table>n</NewDataSet>", :@xmlns=>"http://www.webserviceX.NET"}}
但是现在,我不知道如何正确解析这个响应以获得"Symbol"。
我得到这个错误:
`TypeError (no implicit conversion of Symbol into Integer):`
更新:
如果我这样做:
symbol = response.to_hash[:get_element_symbol_response][:get_element_symbol_result]
logger.debug "Symbol=" + symbol.inspect
符号= "<NewDataSet>n <Table>n <Symbol>Zn</Symbol>n </Table>n</NewDataSet>"
我认为错误是我试图在哈希模式下获得Symbol,而不是。但是我怎样才能得到这个符号呢?
您可以使用nokogiri来解析XML文本:
require 'nokogiri'
text = response.body[:get_element_symbol_response][:get_element_symbol_result]
Nokogiri::XML(text).css('Symbol').text # => Zn
# or
Nokogiri::XML(text).xpath('//NewDataSet/Table/Symbol').text # => Zn