2014-01-19 3 views
2

Savon 2.1 используется: атрибуты! для добавления атрибутов во вложенные теги xml. Как это делается в 2.3? Точный же хэш не отображает один и тот же xml.Как добавить в Savon 2.3 вложенные атрибуты?

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

создает

<person> 
    <address id="44"/> 
    </person> 
    <attributes> 
    <person> 
     <id>666</id> 
    </person> 
    </attributes> 

вместо

<person id=\"666\"><address id=\"44\"></address></person> 

Для справки: How do I use savon nested attributes! hash?

Другой пример, где даже внутренние атрибуты! терпит неудачу

{ 
    'Objects' => [{ 
    'EmailAddress' => '[email protected]', 
    :attributes! => { 
     'EmailAddress' => { 'xsi:type' => "tns:email" } 
    } 
    }], 
    :attributes! => { 
    'Objects' => { 'xsi:type' => "tns:Subscriber" }, 
    } 
} 

Производит:

<Objects> 
    <EmailAddress>[email protected]</EmailAddress> 
    <attributes> 
     <EmailAddress> 
     <xsi:type>tns:email</xsi:type> 
     </EmailAddress> 
    </attributes> 
    </Objects> 
    <attributes> 
    <Objects> 
     <xsi:type>tns:Subscriber</xsi:type> 
    </Objects> 
    </attributes> 

Позже пример и окончательное обоснование для выдачи пытаются создать подписчик для ExactTarget.

https://webservice.exacttarget.com/etframework.wsdl

61 def soap 
62 @soap_client ||= Savon.client(
63  soap_header: header, 
64  wsdl:   'https://webservice.exacttarget.com/etframework.wsdl', 
65  endpoint:  endpoint, 
66  wsse_auth: ["*", "*"], 
67  raise_errors: false, 
68  log:   true, 
69  open_timeout: 180, 
70  read_timeout: 180, 
71  pretty_print_xml: true 
72 ) 
73 end 

112 def create_subscriber 
113 soap.call :create, :message => { 
114  'Objects' => [{ 
115  'EmailAddress' => '[email protected]' 
116  }], 
117  :attributes! => { 
118  'Objects' => { 'xsi:type' => "tns:Subscriber" }, 
119  } 
120 } 
121 end 

Заголовок опущено, поскольку она содержит учетные данные.

+0

Я ожидаю, что это должно работать в Савоном 2.3. Попытка отследить WSDL, который имеет некоторые параметры, я могу перейти к операции по отладке, это немного сложно. – tjarratt

+0

ExactTarget wsdl - это то место, где у меня возникают ошибки. Я пытаюсь создать подписчика. – Justin

+0

У меня такая же проблема. – banditKing

ответ

3

я в конечном итоге получить так:

soap.call :create, :message => { 
    'Objects' => [{ 
     'EmailAddress' => '[email protected]', 
     :'@xsi:type' => "tns:Subscriber" 
    }] 
    } 

Атрибуты помечаются в том же уровне, используя @