Rober
Rober

Reputation: 6108

Parsing XML response with Rails 4 and Savon 2

I´m using Rails and Savon 2 to get data from a SOAP Webservice.

This is the code:

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]

The request is ok and I´m getting the data in the response:

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"}}

But now, I don´t know how to parse this response correctly to get the "Symbol".

I´m getting this error:

`TypeError (no implicit conversion of Symbol into Integer):`

UPDATE:

If I do:

symbol = response.to_hash[:get_element_symbol_response][:get_element_symbol_result]
logger.debug "Symbol=" + symbol.inspect

I get this: Symbol="<NewDataSet>\n <Table>\n <Symbol>Zn</Symbol>\n </Table>\n</NewDataSet>"

I think the error is that I´m trying to get Symbol in hash mode, and it is not. But how can I get the symbol? I can´t believe I have to parse the string manually...

Upvotes: 1

Views: 874

Answers (1)

dimakura
dimakura

Reputation: 7655

You can use nokogiri to parse XML text:

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

Upvotes: 2

Related Questions