7

我正在考虑将 Ruby savon 用于 SOAP。出于纯粹受虐的原因,我必须处理具有属性的 SOAP 元素。

所以,没问题,savon docs 网站上有一个例子突出了这种能力:

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

我的问题是如何在子元素上设置属性,例如,假设我向 person 添加地址子元素:

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

现在我想为地址元素添加一个 id 属性:

如果我将地址嵌套在属性哈希中,那就不行了:

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

所以我的问题是,我怎样才能得到这个?

<person id=666><address id=44></address></person>
4

2 回答 2

18

我遇到了上一个答案不再起作用的问题。最终,我找到了https://github.com/savonrb/savon/issues/518,它引导我使用正确的语法来添加属性。

所以前面的例子现在可以这样完成

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

这将生成以下xml

<person id="666">
  <address id="44"/>
</person>
于 2015-02-11T19:02:59.040 回答
14

你很接近 - 只需将:attributes!密钥放在包含该值的相同哈希中。

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

# => "<person id=\"666\"><address id=\"44\"></address></person>"
于 2010-12-09T04:56:48.967 回答