ROXML es una librería que nos permite transformar documentos xml a objetos usando anotaciones. El uso de documentos xml se hace mucho más transparente y se agiliza el desarrollo de aplicaciones RESTful.
Lo primero que hay que hacer es instalar la librería. Para esto ejecutamos:
Para ver como usar la librería veamos un ejemplo paso a paso.
Supongamos que queremos invocar un servicio web que nos devuelve el siguiente documento xml:
<response>
<query></query>
<results>
<result id="1">
<description><![CDATA[The description!]]></description>
<url></url>
<date></date>
</result>
<result id="2">
<description><![CDATA[Other description!]]></description>
<url></url>
<date></date>
</result>
</results>
</response>
Se podría recorrer todo el documento usando ReXML e ir creando los objectos pero veamos como se simplifica con ROXML.
Primero crearemos la clase Result, que será la encargada de mapear los elementos result que incluya el documento. Cada elemento de texto que queramos incluir dentro de la clase result lo indicaremos con la etiqueta xml_text y cada atributo del elemento lo indicaremos con la etiqueta xml_attribute. Para indicar que un texto incluye la etiqueta CDATA lo declararemos con ROXML::TAG_CDATA.
Vemos como queda ahora el códico de la clase Result:
class Result
include ROXML
xml_attribute :id
xml_text :description ROXML::TAG_CDATA
xml_text :url
xml_text :date
end
La creación de la clase Response es prácticamente identica salvo que tendremos que declarar la lista de elementos result creando un xml_object con la etiqueta ROXML::TAG_ARRAY. Con lo que la clase Response de nuestro ejemplo quedaría como se ve a continuación:
class Response
include ROXML
xml_text :query
xml_object :results, Result, ROXML::TAG_ARRAY, "results"
end
Una vez que ya tenemos la estructura de clases que van a almacenar nuestro documento veamos como quedaría el método que llama al servicio web y nos devuelve un objecto Response con los datos del documento:
def invoke_service
#Creamos la conexión con el servicio
Net::HTTP.start('web_service_url', 80) do |http|
service_response = @connection.get('search_url', 'Accept' => 'text/xml')
#Creamos un documento xml con la respuesta del servicio
document = Document.new service_response.body
#Parseamos el documento con nuestra clase Resonse
@response = Response.parse document.root
end
end
Como se puede ver, gracias a ROXML podemos transformar todo un documento xml con el método parse. Más facil imposible.


Escribe un comentario
Los comentarios están cerrados