2010-08-04 18 views
19

Qualcuno può dirmi come analizzare questo su rotaie.Rails XML parsing

<?xml version="1.0" encoding="utf-8"?> 
<message> 
    <param> 
    <name>messageType</name> 
    <value>SMS</value> 
    </param> 
    <param> 
    <name>id</name> 
    <value>xxxxxxxxxxxxxx</value> 
    </param> 
    <param> 
    <name>source</name> 
    <value>xxxxxxxxxxx</value> 
    </param> 
    <param> 
    <name>target</name> 
    <value>xxxxxxxxxxxxx</value> 
    </param> 
    <param> 
    <name>msg</name> 
    <value>xxxxxxxxxxxxx</value> 
    </param> 
    <param> 
    <name>udh</name> 
    <value></value> 
    </param> 
</message> 

non ho alcun controllo su questo xml, ma spero di poter rendere il parametro è simile al seguente prima di salvare al mio database

message"=>{"msg"=>"sampler", "id"=>"1", "target"=>"23123", "source"=>"312321312"} 

qui è il parametro che ho ricevuto quando accedere al mio metodo

message"=>{"param"=>[{"name"=>"id", "value"=>"2373084120100804002252"}, {"name"=>"messageType", "value"=>"SMS"}, {"name"=>"target", "value"=>"23730841"}, {"name"=>"source", "value"=>"09156490046"}, {"name"=>"msg", "value"=>"Hello world via iPhone"}, {"name"=>"udh", "value"=>nil}]} 

risposta

51

Ci sono molte librerie di analisi Ruby XML. Tuttavia, se il XML è di piccole dimensioni, è possibile utilizzare l'ActiveSupport Hash estensione 'from_xml':

Hash.from_xml(x)["message"]["param"].inject({}) do |result, elem| 
    result[elem["name"]] = elem["value"] 
    result 
end 

=> { "msg" => "xxxxxxxxxxxxx", "messageType" => "SMS", "UDH" => nil, "id" => "xxxxxxxxxxxxx", "target" => "xxxxxxxxxxxxx", "source" => "xxxxxxxxxxx"}

+0

oh amico puoi aiutarmi, e se l'input proviene da @message = Message.new (params [: message]) .. Non so come inserirlo sulla X .. mi dà un NIL risultato sto usando questo, ma doesnt lavoro mobi = (params [: messaggi]). to_xml – Budgie

+0

come farlo funzionare da questo codice: D @message = Message.new (params [: messaggio]) respond_to do | format | if @ message.save format.html {redirect_to (@message,: notice => 'Messaggio è stato creato con successo.')} format.xml {render: xml => @message,: status =>: created,: location => @message} altro format.html {render: action => "nuovo"} { format.xml render: xml => @ message.errors,: status =>: unprocessable_entity} fine fine end – Budgie

1

Inoltre, provare a verificare REXML per problemi più complessi.

11

È necessario utilizzare Nokogiri per analizzare l'xml. È piuttosto veloce.