2012-06-21 9 views
7

No sé qué nombre pasa y eso ha complicado mi búsqueda.convirtiendo de xml name-values ​​en hash simple

Mi archivo de datos OX.session.xml es en la forma (de edad?)

<?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> 

Lo que se llama formato de datos XML exactamente?

En fin, todo lo que quiero es terminar con una almohadilla en mi código Ruby, así:

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

¿Cuál podría ser más corto, más integrada en forma de Ruby para automatizar la leída de hash, de una manera ¿Puedo actualizar el valor de SessionID y almacenarlo fácilmente en el archivo para ejecuciones posteriores del programa?

He jugado con YAML, REXML pero preferiría no imprimir mis (malos) ejemplos de prueba.

+0

Es llamado XML binding (asignación de XML a objetos en otro idioma) o conversión XML. – Maarten

Respuesta

16

hay algunas bibliotecas que puedes usar en Ruby para hacer esto.

Rubí caja de herramientas tiene una buena cobertura de algunos de ellos:

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

utilizo XMLSimple, sólo requieren la gema después cargue en el archivo XML usando xml_in:

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

Si estás en un entorno de Rails, solo puedes utilizar Active Support:

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

'gem install xml-simple' Gracias, comprobaré si existe un método' .xml_out' tan simple para guardarlo de nuevo en el archivo ... – Marcos

+0

Sí, xml_out tomará una estructura de datos (Hash, en su caso)), y devolverlo en codificación XML. – ply

+0

Hash.from_xml toma una cadena xml, no un nombre de archivo ... – NobodysNightmare

7

Usando Nokogiri a analizar el código XML con espacios de nombres:

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"} 

Si sabe que el CAppLogin es el elemento raíz, puede simplificar un poco:

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

Gracias, me gusta su segundo ejemplo mejor, ya que no sé/no me importa cuál será el nombre del elemento raíz, que contiene los pares clave/valor reales que necesito editar y guardar de nuevo en el archivo de algun modo. – Marcos

Cuestiones relacionadas