1

そのため、Railsアプリからこのサービスにアクセスする必要があります。私はsoap4rを使用してWSDLを読み取り、サービスにアクセスするためのメソッドを動的に生成しています。

私が読んだことから、ネストされたXMLノードにアクセスするためのメソッドをチェーンできるはずですが、それを機能させることができません。wsdl2rubyコマンドを使用して、生成されたコードを読み通してみました。私の知る限り、soapライブラリはこれらのアクセサメソッドを生成していません。私はルビーにかなり慣れていないので、何かが足りないのかどうかわかりませんか?

要素を調べると、必要なデータが表示されます。私はそれに到達することはできません。

たとえば、次のコードを使用する場合:

require "soap/wsdlDriver"
wsdl = "http://frontdoor.ctn5.org/CablecastWS/CablecastWS.asmx?WSDL"
driver = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
response = driver.getChannels('nill')
puts response.inspect

次の出力が得られます。

ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}binding
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}operation
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}body
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}address
#<SOAP::Mapping::Object:0x80b96394 {http://www.trms.com/CablecastWS/}GetChannelsResult=#<SOAP::Mapping::Object:0x80b96178 {http://www.trms.com/CablecastWS/}Channel=[#<SOAP::Mapping::Object:0x80b95f5c {http://www.trms.com/CablecastWS/}ChannelID="1" {http://www.trms.com/CablecastWS/}Name="CTN 5">, #<SOAP::Mapping::Object:0x80b9519c {http://www.trms.com/CablecastWS/}ChannelID="2" {http://www.trms.com/CablecastWS/}Name="PPAC 2">, #<SOAP::Mapping::Object:0x80b94620 {http://www.trms.com/CablecastWS/}ChannelID="14" {http://www.trms.com/CablecastWS/}Name="Test Channel">]>>

したがって、データは間違いなくそこにあります!

上記で使用されているメソッドに対してwsdl2rubyによって生成されたコードは次のとおりです。

# {http://www.trms.com/CablecastWS/}GetChannels
class GetChannels
  def initialize
  end
end

# {http://www.trms.com/CablecastWS/}GetChannelsResponse
#   getChannelsResult - ArrayOfChannel
class GetChannelsResponse
  attr_accessor :getChannelsResult

  def initialize(getChannelsResult = nil)
    @getChannelsResult = getChannelsResult
  end
end

長い投稿で申し訳ありませんが、情報が多ければ多いほど、誰かが私を正しい方向に向けることができる可能性が高いと考えました。

ありがとう

-光線

4

1 に答える 1

4

答え

require "soap/wsdlDriver"
wsdl = "http://frontdoor.ctn5.org/CablecastWS/CablecastWS.asmx?WSDL"
driver = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
response = driver.getChannels('nill')

for item in response.getChannelsResult.channel
  puts item.name
  puts item.channelID
end

どうやって答えを得たのか

あなたは経由で応答の方法を理解することができます

response.methods

これにより、分類が難しいメソッドの長いリストが得られるので、ジェネリックメソッドを差し引くのが好きです。Rubyでは配列を減算できます。

response.methods - Object.new.methods

この手法を使用して、応答用のgetChannelsResultメソッドを見つけました。プロセスを繰り返しました

resonse.getChannelsResult.methods - Object.new.methods

その結果のチャネルメソッドを見つけました。また!

response.getChannelsResult.channel.methods - Object.new.methods

これにより、sort、min、maxなどの一連のメソッドが返されました。したがって、Arrayを推測しました。簡単な確認が必要でした

response.getChannelsResult.channel.class

案の定、それは配列を返しました。生活をシンプルにするために、配列の最初の項目を操作してメソッドを取得しました

response.getChannelsResult.channel.first.methods - Object.new.methods

おっと、私はさらに2つのメソッド「name」と「channelID」を見つけました

于 2009-10-31T03:32:47.000 に答える