使用 Rails 4 和 Savon 2 解析 XML 响应

Parsing XML response with Rails 4 and Savon 2

我正在使用 Rails 和 Savon 2 从 SOAP Web 服务获取数据。

这是代码:

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