2011-10-28 6 views
9

Tengo un cliente que está enviando XML para que mi sitio lo analice. Normalmente soy un tipo PHP y entiendo cómo analizarlo a través de PHP, pero no estoy seguro de cómo hacer lo mismo con Ruby. El cliente dijo que van a publicar su archivo XML a mi servidor (código es decir, por debajo)Obtener la solicitud POST del archivo XML para analizar con Ruby on Rails

curl -X POST -H "Content-Type: text/xml" -d "@/path/to/file.xml" my-web-address.com/parser 

y luego la página manejador analizador tiene que ser capaz de detectar que un archivo fue enviado a ella, y analizarlo. ¿Esto significa que Ruby simplemente busca alguna solicitud POST? ¿A qué llamo para que el contenido POST (archivo XML) se convierta en una variable que lo desordene?

Estoy usando Nokogiri para analizar el XML.

doc = Nokogiri::XML(xml) 

¡Apreciar cualquier idea!

Respuesta

12

Tenga en cuenta que ya obtiene los contenidos XML en params, como un hash. Pero si usted prefiere utilizar Stil Nokogiri:

def some_action 
    doc = Nokogiri::XML(request.body.read) # or Nokogiri::XML.fragment 
    ... 
end 
3

si utiliza carriles que si la solicitud POST xml "decodificar". ejemplo:

<?xml version="1.0"?> 
<group id="3"> 
    <point> 
    <value>70.152100</value> 
    </point> 
    <point> 
    <value>69.536700</value> 
    </point> 
</group> 

estaría disponible en los parametros variables

params['group']['id'] # => '3' 

si está empeñado en utilizar nokogiri que suena como que tiene XML mal formado, Proveedores:

Nokogiri::XML.fragment(request.body.read) 
+0

¡Gracias! Todo está listo ahora. –

+0

Esta característica se eliminó del núcleo de Rails comenzando por Rails 4. Necesitamos usar una gema separada ahora https://github.com/rails/actionpack-xml_parser – bloudermilk

0

simple solución sin gemas externas:

class MyController < ApplicationController 

    def postxml 
    h = Hash.from_xml(request.body.read) 
    Rails.logger.info h 

    render status: 200 
    end 

end