同じ名前の要素とcomplexTypeを含むいくつかの異なるWSDLファイルに遭遇しました。たとえば、http ://soap.search.msn.com/webservices.asmx? wsdlには、「SearchResponse」という名前の2つのエンティティがあります。
このシナリオでは、SoapClient()の「classmaps」オプションを使用してこれらのエンティティをPHPクラスに適切にマップする方法を理解できません。
PHPのマニュアルには次のように書かれています。
classmapオプションを使用して、一部のWSDLタイプをPHPクラスにマップできます。このオプションは、WSDLタイプをキーとして、PHPクラスの名前を値として持つ配列である必要があります。
残念ながら、同じキー('SearchResponse')を持つ2つのWSDLタイプがあるため、2つのSearchResponseエンティティを区別して対応するPHPクラスに割り当てる方法がわかりません。
たとえば、WSDLの例の関連するスニペットは次のとおりです。
<xsd:complexType name="SearchResponse">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="Responses" type="tns:ArrayOfSourceResponseResponses"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="SearchResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="Response" type="tns:SearchResponse"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
クラスマップキーが同じであるため、明らかに機能しないPHPは次のとおりです。
<?php $server = new SoapClient("http://soap.search.msn.com/webservices.asmx?wsdl", array('classmap' => array('SearchResponse' => 'MySearchResponseElement', 'SearchResponse' => 'MySearchResponseComplexType'))); ?>
解決策を探していると、Java Web Servicesが、「Element」または「ComplexType」エンティティにカスタムサフィックスを指定できるようにすることでこれを処理していることがわかりました。
ですから、今のところ、PHPのSoapClientでそれを行う方法はないように感じますが、誰かがアドバイスを提供できるかどうか知りたいです。FWIW、リモートWDSLを編集できません。
何か案は???