7

I'm looking at using Ruby savon for SOAP. For purely masochistic reasons I have to deal with SOAP elements having attributes.

So, no problem, there is an example on the savon docs site which highlights this ability:

{ :person => "Eve", :attributes! => { :person => { :id => 666 } } }.to_soap_xml
"<person id=\"666\">Eve</person>"

My problem is how do I set attributes on child elements, for example, say I add an address child element to person:

{ :person => {:address => ""}, :attributes! => { :person => { :id => 666 } } }.to_soap_xml

Now I want to add an id attribute to the address element:

It's no go if I nest address in the attributes hash:

{ :person => {:address => ""}, :attributes! => { :person => { :id => 666, :address => {:id => 44 }} }}.to_soap_xml

So my question is, how can I get this?

<person id=666><address id=44></address></person>
the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Sameer C
  • 2,777
  • 1
  • 18
  • 12

2 Answers2

18

I ran across the issue of the previous answer no longer working. Eventually I found https://github.com/savonrb/savon/issues/518 which lead me to the correct syntax to add attributes now.

So the previous example would now be done as

{ 
  :person => {
    :@id => 666,
    :address => {
      :@id => 44
    }
  }
}

Which would generate the following xml

<person id="666">
  <address id="44"/>
</person>
DuckNG
  • 214
  • 4
  • 5
  • how can I use it for this block .. 40665905851 – chirag7jain Feb 13 '15 at 05:24
  • 11
    In case some poor soul comes looking for information on Savon XML attribute generation: `address: {'content!': "Downing street", '@id': 44}` would generate `
    Downing Street
    `
    – Arctodus Jul 25 '17 at 00:05
14

You were close - just needed to put the :attributes! key in the same hash that contains the value.

{
  :person => {
    :address => "", 
    :attributes! => { :address => { :id => 44 } }
  }, 
  :attributes! => { :person => { :id => 666 } } 
}.to_soap_xml

# => "<person id=\"666\"><address id=\"44\"></address></person>"
rubiii
  • 6,903
  • 2
  • 38
  • 51
trptcolin
  • 2,320
  • 13
  • 16