2012-05-10 17 views
2

Savonでは、要素の数に基づいてタグの配列を作成する方法はitem_id?これのための他の方法?Ruby - Rails - Savonの構造SOAP XML本体

item_id = "abc, def, xyz" 
n = item_id.split(,).length 

    #ItemList shall be of n times by creating ItemList for each 
soap.body = { 
    'Body' => { 
       'ItemList' => { 
    'ItemId' => "abc" 
       } 
       'ItemList' => { 
    'ItemId' => "def" 
       } 
       'ItemList' => { 
    'ItemId' => "xyz" 
       } 
      } 
    } 

EDIT:以下はBodyは、各ItemIdに対して複数のItemList値タグを持たなければならない、実際に予想されるXMLのサンプルです。 ItemId長さは何でもかまいません。

item_id = "abc, def, xyz" #split this and make xml for each item. 

<Body> 
<ItemList> 
<ItemId>abc</ItemId> #abc 
<TimeStamp> 
    <Time>04:57:40</Time> 
    <TimeZone>EST</TimeZone> 
    <Date>2012-05-12</Date> 
</TimeStamp> 
<ContactInfo> 
    <Phone>888-888-8880</Phone> 
    <Email>[email protected]</Email> 
    <Name>name1</Name> 
</ContactInfo> 
</ItemList> 

<ItemList> 
<ItemId>def</ItemId> #def 
<TimeStamp> 
    <Time>04:27:40</Time> 
    <TimeZone>EST</TimeZone> 
    <Date>2012-05-12</Date> 
</TimeStamp> 
<ContactInfo> 
    <Phone>888-888-8881</Phone> 
    <Email>[email protected]</Email> 
    <Name>name2</Name> 
</ContactInfo> 
</ItemList> 

<ItemList> 
<ItemId>xyz</ItemId> #xyz 
<TimeStamp> 
    <Time>04:37:40</Time> 
    <TimeZone>EST</TimeZone> 
    <Date>2012-05-12</Date> 
</TimeStamp> 
<ContactInfo> 
    <Phone>888-888-8882</Phone> 
    <Email>[email protected]</Email> 
    <Name>name3</Name> 
</ContactInfo> 
</ItemList> 
</Body> 
+0

XMLで期待される成果は?上記のステートメントを使用して作成したXMLの外観はどうですか? –

+0

@SteffenRoller - ハイステファン。私は私の質問を更新しました。基本的に私はxmlを生成したい文字列/配列を持っています。分割された値自体はxmlの内部タグの1つに過ぎません。私は各項目のために複数の外部タグを作成し、それに他のデータを追加する必要があります。 –

答えて

1

私はこのようなビルダーを使用します。その後、得られたxml文字列をSavonのxml.bodyとして使用します。

require 'builder' 

itemliste = [ 
    { 'ItemId' => 'abc', 
    'TimeStamp' => 
     { 'Time' => '04:57:40', 
      'TimeZone' => 'EST', 
      'Date' => '2012-05-12'}, 
    'ContactInfo' => 
     { 'Phone' => '888-888-8880', 
      'Email' => '[email protected]', 
      'Name' => 'John Doe' } }, 
    { 'ItemId' => 'def', 
    'TimeStamp' => 
     { 'Time' => '04:27:40', 
      'TimeZone' => 'EST', 
      'Date' => '2012-05-12'}, 
    'ContactInfo' => 
     { 'Phone' => '888-888-8881', 
      'Email' => '[email protected]', 
      'Name' => 'Jane Doe' } }, 
    { 'ItemId' => 'ghi', 
    'TimeStamp' => 
     { 'Time' => '04:17:40', 
      'TimeZone' => 'EST', 
      'Date' => '2012-05-12'}, 
    'ContactInfo' => 
     { 'Phone' => '888-888-8882', 
      'Email' => '[email protected]', 
      'Name' => 'Jane Three' } }, 
    { 'ItemId' => 'xyz', 
    'TimeStamp' => 
     { 'Time' => '04:07:40', 
      'TimeZone' => 'EST', 
      'Date' => '2012-05-12'}, 
    'ContactInfo' => 
     { 'Phone' => '888-888-8883', 
      'Email' => '[email protected]', 
      'Name' => 'Joe Sixpack' } } 
] 

item_id = "abc,def,xyz" 
keys = item_id.split(',') 
xml_body = "" 
xml = Builder::XmlMarkup.new(:target => xml_body, :indent => 2) 
xml.Body do 
    itemliste.each do |item| 
    if item_id.include? item['ItemId'] 
     xml.ItemList do 
     xml.ItemId item['ItemId'] 
     xml.TimeStamp do 
      xml.Time item['TimeStamp']['Time'] 
      xml.TimeZone item['TimeStamp']['TimeZone'] 
      xml.Date item['TimeStamp']['Date'] 
     end 
     xml.ContactInfo do 
      xml.Phone item['ContactInfo']['Phone'] 
      xml.Name item['ContactInfo']['Name'] 
      xml.Email item['ContactInfo']['Email'] 
     end 
     end 
    end 
    end 
end 
puts xml_body 
+0

Steffenを手伝ってくれてありがとう! – rubiii