親ノード内で名前を変更したりラップしたりするだけで問題が解決する場合は、実際には非常に驚きます。解決策に近づくにつれて、サービスでさらに多くの問題が発生することになると思います。私は(残念ながら)以前にこのボートに乗ったことがあるので、学んだことを書いています。
一般に、サービスが複雑なXMLや醜いXMLを予期している場合、ActiveResourceを介してサービスを処理するのはやや難しいことがわかりました。これらの場合の私のソリューションは、必然的にオブジェクトのto_xmlメソッドをオーバーライドすることになります。これは、作成(POST)または更新(PUT)がオブジェクトのto_xmlを内部的に呼び出して、データをXMLにシリアル化する必要があるためです。これらのメソッドは、rubyのxmlビルダーを利用することも、さらにトリッキーなものに「ヒアドキュメント」を使用することもできます。肝心なのは、サービスが何を期待しているのかを正確に把握し、その構造を構築してサービスに送信する必要があるということです。
たとえば、「ヒアドキュメント」を使用して、わかりにくいxml構造を強制します。
class User << ActiveResource::Base
def to_xml
xml =<<-EOS
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<platform_user>
<user xsi:type="userData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<userId>#{self.id}</userId>
<userName>#{self.name}</userName>
<addresses>
<address>
<address1>#{self.address1}</address1>
<addressZip>#{self.zip}</addressZip>
</address>
</addresses>
</user>
</platform_user>
EOS
xml.gsub(/\n|\t|\r/,"").strip #clean it up.
end
end
XML Builderを使用して、構造に合わせて機能させることもできます。次に例を示します。
def to_xml
xml = Builder::XmlMarkup.new()
xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8", :standalone=>"yes"
xml.platform_user do
xml.user do
xml.userId self.id
...
end
end
end
幸運を。