2010-08-04 44 views
19

任何人都可以告訴我如何解析這在軌道上。Rails的XML解析

<?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> 

我對這個XML無法控制,但我希望我可以讓參數看起來像這樣保存到我的數據庫

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

這裏之前是當它進入我的方法,我收到的參數

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}]} 

回答

51

有很多Ruby XML解析庫。但是,如果你的XML是小,你可以使用的ActiveSupport哈希擴展名 'from_xml':

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

=> { 「味精」=> 「XXXXXXXXXXXXX」, 「爲messageType」=> 「SMS」, 「UDH」 =>「xxxxxxxxxxxxxx」,「target」=>「xxxxxxxxxxxxx」,「source」=>「xxxxxxxxxxx」}

+0

哦,老兄你能幫助我,如果輸入是來自@message = Message.new(params [:message])..我不知道如何將它插入X ..它給了我一個NIL結果 我使用這一點,但它不工作摩比=(PARAMS [:消息])。to_xml – Budgie 2010-08-06 09:41:19

+0

如何使它從該代碼工作:d @message = Message.new(PARAMS [:消息]) respond_to do | format | if @ message.save format.html {redirect_to(@message,:notice =>'Message was successfully created。')} format.xml {render:xml => @message,:status =>:created,:位置=> @message} 其他 format.html {渲染:行動=> 「新」} format.xml {渲染:XML => @ message.errors,:狀態=>:unprocessable_entity} 結束 結束 結束 – Budgie 2010-08-06 09:56:32

1

此外,請嘗試檢出REXML以解決更復雜的問題。

11

您應該使用Nokogiri來解析xml。它相當快。