2012-06-21 8 views
7

Non so quale nome passi e questo ha complicato la mia ricerca.conversione da valori di nome xml in semplice hash

mio file di dati OX.session.xml è nella (vecchia?) Forma

<?xml version="1.0" encoding="utf-8"?> 
<CAppLogin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://oxbranch.optionsxpress.com"> 
    <SessionID>FE5E27A056944FBFBEF047F2B99E0BF6</SessionID> 
    <AccountNum>8228-5500</AccountNum> 
    <AccountID>967454</AccountID> 
</CAppLogin> 

cosa è che il formato di dati XML chiamato esattamente?

In ogni caso, tutto quello che voglio è finire con un hash nel mio codice Ruby in questo modo:

CAppLogin = { :SessionID => "FE5E27A056944FBFBEF047F2B99E0BF6", :AccountNum => "8228-5500", etc. } # Doesn't have to be called CAppLogin as in the file, may be fixed 

Quale potrebbe essere più breve, più integrata in modo Rubino per automatizzare quello letto hash, in maniera Posso aggiornare il valore SessionID e memorizzarlo facilmente nel file per le esecuzioni del programma successive?

Ho giocato con YAML, REXML ma preferisco non stampare ancora i miei (cattivi) esempi di prove.

+0

È chiamato XML binding (mapping XML agli oggetti in un'altra lingua) o conversione XML! – Maarten

risposta

16

ci sono pochi librerie che puoi usare in Ruby per farlo.

Rubino toolbox ha qualche buona copertura di alcuni di loro:

https://www.ruby-toolbox.com/categories/xml_mapping

Io uso XMLSimple, basta richiedere la gemma quindi caricare nel file XML utilizzando xml_in:

require 'xmlsimple' 
hash = XmlSimple.xml_in('session.xml') 

Se sei in un ambiente Rails, puoi semplicemente utilizzare Active Support:

require ‘active_support’ 
session = Hash.from_xml('session.xml') 
+0

'gem install xml-simple' Grazie, controllerò se c'è un semplice metodo' .xml_out' per salvarlo direttamente nel file ... – Marcos

+0

Sì, xml_out avrà una struttura dati (Hash, nel tuo caso) e restituirlo nella codifica XML. – ply

+0

Hash.from_xml accetta una stringa xml, non un nome file ... – NobodysNightmare

7

Utilizzando Nokogiri per analizzare il codice XML con spazi dei nomi:

require 'nokogiri' 

dom = Nokogiri::XML(File.read('OX.session.xml')) 

node = dom.xpath('ox:CAppLogin', 
       'ox' => "http://oxbranch.optionsxpress.com").first 

hash = node.element_children.each_with_object(Hash.new) do |e, h| 
    h[e.name.to_sym] = e.content 
end 

puts hash.inspect 
# {:SessionID=>"FE5E27A056944FBFBEF047F2B99E0BF6", 
# :AccountNum=>"8228-5500", :AccountID=>"967454"} 

Se conosce che il CAppLogin è l'elemento principale, è possibile semplificare un po ':

require 'nokogiri' 

dom = Nokogiri::XML(File.read('OX.session.xml')) 

hash = dom.root.element_children.each_with_object(Hash.new) do |e, h| 
    h[e.name.to_sym] = e.content 
end 

puts hash.inspect 
# {:SessionID=>"FE5E27A056944FBFBEF047F2B99E0BF6", 
# :AccountNum=>"8228-5500", :AccountID=>"967454"} 
+0

Grazie, mi piace di più il tuo secondo esempio dato che non so/non voglio preoccuparmi di quale sarà il nome dell'elemento root, che contiene le coppie chiave/valore effettive che ho bisogno di modificare e salvare nel file in qualche modo. – Marcos