2017-08-07 1 views
0

J'ai un xml comme celui-ciconversion noeud nokogiri xml en hash Ruby

<parentNode> 

    <amount>12.0</amount><authIdCode>999999</ authIdCode><currency>USD</currency> 

</ parentNode> 

Comment puis-je obtenir tous les nœuds à l'intérieur du ParentNode à un quelque chose de hachage comme ci-dessous?

{amount: "12", authIdCode: "999999", currency: "USD"} 

Oui je pouvais rechercher des clés individuelles à l'aide nokogiri. Mais est-il possible d'obtenir toutes les clés et les valeurs dans le ParentNode dynamically et le transformer en un hachage?

Merci.

Remarque: Hash.from_xml ne fonctionnera pas comme je ne suis pas en utilisant des rails

Répondre

2

Voici un échantillon de travail:

require 'nokogiri' 

xml = <<-EOS 
<parentNode> 
    <amount>12.0</amount> 
    <authIdCode>999999</authIdCode> 
    <currency>USD</currency> 
</ parentNode> 
EOS 
document = Nokogiri::XML(xml) 

hash = document.xpath("//parentNode/*").each_with_object({}) do |node, hash| 
    hash[node.name] = node.text 
end 

p hash # => {"amount"=>"12.0", "authIdCode"=>"999999", "currency"=>"USD"} 

Il trouve tous les enfants de parentNode, utilise le nom Childs comme clé, son contenu textuel en tant que valeur.

+0

fonctionne très bien .. Merci un compagnon beaucoup .. – Abhilash

+0

Je sais que cela répond à ma question bien .. Mais si un moyen d'obtenir un hachage comme celui-ci. '{" parentNode "=> {" amount "=>" 12.0 "," authIdCode "=>" 999999 "," currency "=>" USD "}}' ... Il obtient donc le noeud indépendamment du nom parentNode ?? .. Il y aura toujours un nœud parent cependant. Donc, le tableau n'est pas nécessaire. Mais le nom du nœud parent peut changer dans certains cas. – Abhilash

+1

Il y aura toujours un seul nœud parent ayant des nœuds enfants? Êtes-vous sûr? Cela signifierait que votre élément racine est le nœud parent. Si oui, vous pouvez utiliser '/ */*' comme XPath. –

2

En utilisant Hash[]:

Hash[doc.search('parentNode/*').map{|n| [n.name, n.text]}] 
#=> {"amount"=>"12.0", "authIdCode"=>"999999", "currency"=>"USD"}