最新リリースのSOAP::WSDLを試しましたがやはりダメ。688行目で「デフォルト名前空間に属する型は単純型」と決め付けられているのが原因です。だああ! なお,ある名前空間がデフォルト名前空間でかつ接頭辞とも関連付けられているというのは合法のようです。
開発中のSOAP::WSDL 2.00は依存パッケージが多いのであんまり入れたくないのですが…どうしようかなあ。
開発中のSOAP::WSDL 2.00は依存パッケージが多いのであんまり入れたくないのですが…どうしようかなあ。
my $defaultNS=$self->{_WSDL}->{tns}; my $name=$p->{ type }; $name=~s/^$defaultNS://; $name=~s/^(.+?:)?//; my $path; { $path='/'.$self->_wsdl_wsdlns.'definitions/' .$self->_wsdl_wsdlns."types/$schemaNS:schema/" ."$schemaNS:complexType[@name='$name']" .'|' .'/'.$self->_wsdl_wsdlns.'definitions/' .$self->_wsdl_wsdlns ."types/schema[@xmlns='" . $nsHash{$schemaNS.':'} ."' and @targetNameSpace = '" . $nsHash{$1}."' ]/" ."complexType[@name='$name']" ; }; $complexType=$self->{_WSDL}->{xpath}->find($path)->shift || die "Error processing WSDL: $path not found";
my $schemaNS=$self->_wsdl_schemans ? $self->_wsdl_schemans .':' : ''; my $path='.//'.$schemaNS.'element'; my $elements=$complexType->find($path) || die "Error processing WSDL: './/".$schemaNS."element' not found";
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions (中略) xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <schema targetNamespace="MyService" xmlns="http://www.w3.org/2001/XMLSchema"> <complexType name="MyComplexType"> <sequence> <element name=(以下略)
my $soap = SOAP::WSDL->new( wsdl => 'http://my.host.name/MyService?wsdl')->proxy('http://my.host.name/MyService');
my $portName=$self->_wsdl_portname || die "Error processing WSDL: no port name"; $path='/' . $self->_wsdl_wsdlns . 'definitions/' .$self->_wsdl_wsdlns . "portType[\@name='$portName']/" .$self->_wsdl_wsdlns . "operation[\@name='$method']/" .$self->_wsdl_wsdlns ."$mode/\@message"; # try cache first if caching is enabled my $messageName=$self->{_WSDL}->{ caching } ? $self->{_WSDL}->{ cache }->{ $path } : undef; $messageName=$xpath->findvalue($path);
# find address in service ports my $path=$self->servicename ? "[\@name='". $self->servicename ."']" : ''; $path="/".$self->_wsdl_wsdlns."definitions/" .$self->_wsdl_wsdlns."service$path/" .$self->_wsdl_wsdlns."port/" .$self->_wsdl_ns->{'http://schemas.xmlsoap.org/wsdl/soap/'} ."address[\@location='$location']"; my $service=$xpath->find($path) # get 1st matching node -> get parent node -> get value of "name" ->shift || die "Error processing WSDL file - no such service ($path)"; my $portName=$service->getParentNode->findvalue('@name') || die "Error processing WSDL: Cannot find ". "port for location $location in service $path";
$soap->wsdlinit(); $soap->_wsdl_portname('MyPortName'); # /definitions/portType/@name の値
$soap->method($complex->as_soap_data_instance(name=>'MyName'));
my $prefix = 'ns'; $soap->method( SOAP::Data->uri($complex->OBJ_URI) ->prefix($prefix) ->type($prefix.':'.$complex->OBJ_TYPE) ->name('MyName') ->value($complex->as_soap) );とか書かないといけない。超めどい。