2010-08-04 77 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。它相当快。