Rubyでwsdlを使う方法
soap4rのwsdl2rubyを使ってオブジェクト化するまではできた。
ただしhttpsから取得には失敗→モジュールの追加が必要?
wsdl2ruby.rb --wsdl http://xxxx.wsdl --classdef --force
WSDLのrequired等の情報が欲しいがこの方法では取得できなかったのでwsdl2rubyのソースを追っていくとWSDL::XMLSchema::Parserをつかえばできそう。
ソース解析にはココのサイトを参考にさせて頂きました。
有効なWikiNameではありません - Code Reading Wiki
require 'wsdl/xmlSchema/parser' opt = { :location => 'http://xxxxx?wsdl', :originalroot => nil } WSDL::XMLSchema::Parser.new(opt).parse(File.read("c:/tool/wsdl.txt"))
これを実行すると下記のエラーが発生する。
C:/Program Files/ruby-1.8/lib/ruby/1.8/wsdl/xmlSchema/parser.rb:116:in `decode_tag': unknown element: {http://schemas.xmlsoap.org/wsdl/}definitions (WSDL::XMLSchema::Parser::UnknownElementError) from C:/Program Files/ruby-1.8/lib/ruby/1.8/wsdl/xmlSchema/parser.rb:82:in `start_element' from C:/Program Files/ruby-1.8/lib/ruby/1.8/xsd/xmlparser/parser.rb:67:in `start_element' from C:/Program Files/ruby-1.8/lib/ruby/1.8/xsd/xmlparser/rexmlparser.rb:34:in `tag_start' from C:/Program Files/ruby-1.8/lib/ruby/1.8/rexml/parsers/streamparser.rb:24:in `parse' from C:/Program Files/ruby-1.8/lib/ruby/1.8/rexml/document.rb:201:in `parse_stream' from C:/Program Files/ruby-1.8/lib/ruby/1.8/xsd/xmlparser/rexmlparser.rb:27:in `do_parse' from C:/Program Files/ruby-1.8/lib/ruby/1.8/wsdl/xmlSchema/parser.rb:63:in `parse' from test.rb:142
C:/Program Files/ruby-1.8/lib/ruby/1.8/rexml/parsers/baseparser.rb:389:in `pull': Undefined prefix wsdl found (REXML::UndefinedNamespaceException) from C:/Program Files/ruby-1.8/lib/ruby/1.8/set.rb:195:in `each' from C:/Program Files/ruby-1.8/lib/ruby/1.8/set.rb:195:in `each_key' from C:/Program Files/ruby-1.8/lib/ruby/1.8/set.rb:195:in `each' from C:/Program Files/ruby-1.8/lib/ruby/1.8/rexml/parsers/baseparser.rb:387:in `pull' from C:/Program Files/ruby-1.8/lib/ruby/1.8/rexml/parsers/treeparser.rb:22:in `parse' from C:/Program Files/ruby-1.8/lib/ruby/1.8/rexml/document.rb:227:in `build' from C:/Program Files/ruby-1.8/lib/ruby/1.8/rexml/document.rb:43:in `initialize' from test.rb:69:in `new' from test.rb:69:in `read' from test.rb:114
結局ダメそうなのでREXML::Documentを使ってXMLをDom解析して取り出すことにトホホ
doc = REXML::Document.new(File.read(path)) doc.elements.each('wsdl:definitions/wsdl:types/xs:schema/xs:complexType') {|x| .... }