+1 A favor 0 En Contra
Nov18

Parsear XML en Ruby

Si temos una pagina a la cual le queremos adicionar informacion extra de otra pagina,  la cual cuenta con un servico de API(Interfaz de Programación de Aplicaciones), por lo general nos entrega la informacion en un formato XML(Extensible Markup Language).

Nosotros lo debemos de parsear para poder sacar la informacion que deseamos. Si tenemos la siguiente informacion de un XML asi :

<artist>
<name>Cher</name>
<image size="medium">http://userserve-ak.last.fm/serve/64/114168.jpg</image>
<image size="large">http://userserve-ak.last.fm/serve/126/114168.jpg</image>
<similar>
<artist>
<name>Madonna</name>
<image size="small">http://userserve-ak/5112299.jpg</image>
<image size="medium">http://userserve-ak/5112299.jpg></image>
<image size="large">http://userserve-ak/5112299.jpg</image>
</artist>
...
</similar>
<bio>
<summary>Cher is an American singer </summary>
</bio>
</artist>

Primero descargamos el XML y la colocamos en una variable de tipo REXML :

require 'net/http'
require 'rexml/document'

url = 'http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&lang=es
url = url.gsub(/ /,"+")
xml_data = Net::HTTP.get_response(URI.parse(url)).body
doc = REXML::Document.new(xml_data)

La libreria REXML (Ruby eléctricos XML) XML es el procesador de elección de los programadores de Ruby. Que viene incluido con la norma Ruby distribución. Es rápido, escrita en Ruby, y se puede utilizar de dos maneras: árbol de analizar y analizar el flujo.

Empezamos a extraer informacion, primero "summary" del artista :

biografia = doc.root.elements['artist'].elements["bio"].elements["summary"].text 

Con element entramos a una marca y con text sacamos en valor de la marca. Ahora queremos sacar una imagen pero tienen marcas iguales pero con un nombre que las difrencia, tendriamos que hacer la siguiente modificacion :

url_imagen = doc.root.elements['artist'].elements["image[@size='large']"].text 

Ahora queremos sacar informacion de la marca "similar" que contiene a varios para esto tenermos que hacer un bucle que recorra y la informacion lo guarde en un array.

 tag = Array.new
    doc.root.elements.each("artist/similar/artist") { 
    |ele| 
      tag << {:nombre => ele.elements['name'].text,:url_imagen => ele.elements["image[@size='medium']"].text}
    }

La informacion alamacena en el array "tag" seria de la siguiente forma :

tag = [ 
{:nombre=>"name1",:url_imagen=>"url_imagen1"} ,
{:nombre=>"name1",:url_imagen=>"url_imagen1"} ... ]

La cual la podemos extraer asi :

 tag.each do |f| 
  print f[:nombre] 
  print f[:url_imagen]
 end 

 

 

 

 


Si te gusto este artículo puedes dejar un comentario, también puedes suscribirte al canal RSS de la página o compartir este articulo por




Deja tu comentario! Comentarios

Deja tu comentario!

Estadísticas Estadísticas