2011-10-28 12 views
9

Ho un client che sta inviando XML per analizzare il mio sito. Sono tipicamente un ragazzo PHP e capisco come analizzarlo tramite PHP, ma non sono sicuro di come fare lo stesso con Ruby. Il cliente ha detto che stanno per pubblicare il loro file XML al mio server (codice vale a dire al di sotto)Ottenere la richiesta POST del file XML per analizzare con Ruby on Rails

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

e quindi la pagina gestore parser deve essere in grado di rilevare che un file è stato inviato ad esso, e analizzarlo. Questo significa che Ruby cerca semplicemente qualsiasi richiesta POST? Che cosa chiamo per ottenere il contenuto POST (file XML) in una variabile per fare confusione con esso?

Sto usando Nokogiri per analizzare l'XML.

doc = Nokogiri::XML(xml) 

Apprezzare qualsiasi intuizione!

risposta

12

Nota che hai già ottenuto i contenuti XML in params come hash. Ma se si preferisce utilizzare stil Nokogiri:

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

se si utilizza rotaie si deve "decodificare" la richiesta XML POST. Esempio:

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

sarebbe disponibile nelle params variabili

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

se sei morto insieme sull'utilizzo nokogiri suona come avete xml malformato, provare:

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

Grazie! Tutto è pronto adesso. –

+0

Questa funzione è stata rimossa dal nucleo di Rails a partire da Rails 4. Ora è necessario utilizzare una gemma separata https://github.com/rails/actionpack-xml_parser – bloudermilk

0

Semplice soluzione senza gemme esterne:

class MyController < ApplicationController 

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

    render status: 200 
    end 

end