martes, 15 de marzo de 2016

Importar un XML en ruby

Para ello usaremos la gema "nokogiri".

XML

Vamos a jugar con el ejemplo de w3schools que se encuentra en http://www.w3schools.com/xml/xml_attributes.asp
<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>
Lo vamos a guardar en un fichero llamado "example.xml".

Importación

La fase de importación y parsing la hace la propia librearía. Lo que no está tan bien explicado en la documentación es cómo ir consiguiendo los registros sucesivamente y el valor de los campos de los mismos.

Vamos a probar un script como el siguiente

require 'nokogiri'

fichero='./example.xml'

xmlfeed = Nokogiri::XML(open(fichero))
all_items = xmlfeed.xpath("//messages/note")

fields = [ 'to','from','heading','body' ]
all_items.each do |item|
    fields.each do |f|
        entrada = item.at(f)
        valor = entrada.text
        puts "#{f} = #{valor}"
    end
end
#Fin del script
Vamos por partes.

La importación se hace con el bloque:

xmlfeed = Nokogiri::XML(open(fichero))
all_items = xmlfeed.xpath("//messages/note")

Para el fichero podríamos tirar de URL también.
Hasta ahora nosotros no hemos dicho nada de la estructura del XML... ¿ O si ? Si. La librería ha importado todo el XML, pero le hemos dicho que los regustros son eso que está dentro de la estructura de documento en el segundo nivel, esto es "//messages/note". Esto es una de las cosas que debemos hacer bien porque si no el desglose en registros no se hace correctamente.

Los campos que vamos a estudiar deben ser conocidos. Responden a una estructura predeterminada.
fields = [ 'to','from','heading','body' ]
Por supuesto que podríamos obtenerlos pero no complicaremos más el ejemplo.

Finalmente para ilustrar el ejemplo, imprimimos los campos uno a uno por consola.

No hay comentarios:

Publicar un comentario