Convertir la chaîne XML en hachage dans Rails
I l'utilisation de certains services qui renvoie xml:
response = HTTParty.post(service_url)
response.parsed_response
=> "\n\t<Result>\n<success>\ntrue\n</success>\n</Result>"
J'ai besoin de convertir cette chaîne de hachage. Quelque chose comme ceci:
response.parsed_response.to_hash
=> {:result => { :success => true } }
Qui façon de le faire?
source d'informationauteur Rodrigo
Vous devez vous connecter pour publier un commentaire.
Le haut-
from_xml
RailsHash
méthode fera exactement ce que vous voulez. Afin d'obtenir votreresponse.parsed_response
correctement mappé à une table de hachage, vous aurez besoin degsub()
les retours à la ligne:Dans le contexte de l'analyse d'une table de hachage dans les Rails, les objets de
String
type sont pas très différent que ceux deSymbol
à partir d'un général de la programmation. Cependant, vous pouvez appliquer les Railssymbolize_keys
méthode à la sortie:Comme vous pouvez le voir,
symbolize_keys
ne fonctionne pas sur toutes les tables de hachage, mais vous pourriez potentiellement itérer intérieure hachages et les appliquersymbolize_keys
.La dernière pièce du puzzle est de convertir la chaîne
"true"
booléennetrue
. Autant que je sache, il n'y a aucun moyen de le faire sur votre hash en place, mais si vous êtes une itération/exploitation sur elle, vous pourriez potentiellement mettre en œuvre une solution comme celle proposé dans ce post:Fondamentalement, lorsque vous arrivez à l'intérieur des paires clé-valeur, vous feriez appliquer
to_boolean()
de la valeur, qui est actuellement fixé à"true"
. Dans votre exemple, la valeur de retour est le booléentrue
.Utilisation nokogiri pour parser un fichier XML de réponse à ruby de hachage. Il est assez rapide.
Vous pouvez essayer ce ci-dessous:--
require 'active_support/core_ext/hash/conversions'
Hash.from_xml "\n\t<Result>\n<success>\ntrue\n</success>\n</Result>".gsub("\n", "").downcase
De sortie :--
ce que j'ai
{"result"=>{"success"=>"true"}}
Grâce
Utiliser le gem Nokogir
Ces tutoriels peut vous aider.