解析Savon XML响应

时间:2014-07-16 08:03:42

标签: ruby soap ruby-on-rails-4 savon

以下是SOAPUI中SOAP请求的响应

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
  <PostApplication_V5Response xmlns="http://QuiddiServicePricePoints.org/">
     <PostApplication_V5Result><![CDATA[<QuiddiSerivce>
        <Application>
           <Status>PURCHASED</Status>
           <RedirectURL>http://www.google.com?test=abc&xyz=123</RedirectURL>
        </Application>
     </QuiddiSerivce>]]></PostApplication_V5Result>
  </PostApplication_V5Response>
 </soap:Body>
</soap:Envelope>

然而,当我从Savon请求中获得response.body时,它返回

{:post_application_v5_response=>{:post_application_v5_result=>"<QuiddiSerivce><Application><Status>PURCHASED</Status><RedirectURL>http://www.google.com?test=abc&xyz=123</RedirectURL></Application></QuiddiSerivce>", :@xmlns=>"http://QuiddiServicePricePoints.org/"}}

正如您所看到的,我需要的数据,即Status和RedirectURL,我们仍然是XML格式。

我已尝试使用[:post_application_v5_response][:post_application_v5_result]Hash.from_xml()转换为哈希,但由于RedirectURL中的非法字符而失败。

如何正确转义RedirectURL中的字符,以便将结果转换为哈希值,或以其他方式访问Status和RedirectURL?

1 个答案:

答案 0 :(得分:2)

您可以使用Nokogiri来解析响应正文。然后在解析的文档中搜索所需的值。

require 'nokogiri'
response_body = {:post_application_v5_response=>{:post_application_v5_result=>"<QuiddiSerivce><Application><Status>PURCHASED</Status><RedirectURL>http://www.google.com?test=abc&xyz=123</RedirectURL></Application></QuiddiSerivce>", :@xmlns=>"http://QuiddiServicePricePoints.org/"}}
res = Nokogiri.XML(response_body[:post_application_v5_response][:post_application_v5_result])
p res.search('Status').text
p res.search("RedirectURL").text

结果是:

#=> "PURCHASED"
#=> "http://www.google.com?test=abc=123"