2010-08-04 25 views
19

Herkes bana raylarda nasıl ayrılacağını söyler.Raylar XML ayrıştırma

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

bu xml üzerinde hiçbir kontrole sahip, ama benim veritabanında burada

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

için kaydetmeden önce ben parametresi şöyle görünür hale umut benim yöntemi eriştiklerinde aldığım parametredir

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

cevap

51

Çok sayıda Ruby XML ayrıştırma kütüphanesi vardır. "UDH",

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

=> { "msg" => "xxxxxxxxxxxxx", "messageType" => "SMS": XML küçükse Ancak, ActiveSupport Hash uzantısı 'from_xml kullanabilirsiniz => nil, "id" => "xxxxxxxxxxxxxx", "hedef" => "xxxxxxxxxxxxx", "kaynak" => "xxxxxxxxxxx"}

+0

oh ahde bana yardım edebilir misiniz, eğer girdi Message = Message.new'den (params [: message]) .. X'e nasıl ekleyeceğimi bilmiyorum .. bana bir NIL verir sonuç bunu kullanıyorum ama bir işe mobi = (params [: ileti]) doesnt. – Budgie

+0

to_xml bu koddan çalışması nasıl: D @message = Message.new (params [: ileti]) respons_to yapmak | format | @ message.save format.html {redirect_to (@message,: notice => 'İleti başarıyla oluşturuldu.')} format.xml {render: xml => @message,: status =>: created,: location => @message} başka format.html {işlemek: action => "yeni"} format.xml {işlemek: xml => message.errors @: status =>: unprocessable_entity} uç uç sonu – Budgie

1

Ayrıca, daha karmaşık sorunlar için REXML'a bakmayı deneyin.

11

Xml ayrıştırma için Nokogiri kullanmalısınız. Oldukça hızlı.