Я столкнулся с несколькими различными файлами WSDL, которые содержат элемент и complexType с тем же именем. Например, http://soap.search.msn.com/webservices.asmx?wsdl имеет два объекта с именем "SearchResponse":
В этом случае я не могу понять, как правильно сопоставить эти объекты с PHP-классами с помощью параметра SoapClient() "classmaps".
В руководстве PHP сказано следующее:
Опция classmap может использоваться для отображения некоторые типы WSDL для классов PHP. Эта параметр должен быть массивом с WSDL типы как ключи и имена классов PHP как значения.
К сожалению, поскольку существует два типа WSDL с одним и тем же ключом ( "SearchResponse" ), я не могу понять, как различать два объекта 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, который, очевидно, будет не работать, поскольку ключи classmaps одинаковы:
<?php $server = new SoapClient("http://soap.search.msn.com/webservices.asmx?wsdl", array('classmap' => array('SearchResponse' => 'MySearchResponseElement', 'SearchResponse' => 'MySearchResponseComplexType'))); ?>
В поисках решения я нашел, что Java Web Services обрабатывает это, позволяя вам указать собственный суффикс для объектов "Элемент" или "Комплексный тип".
Итак, прямо сейчас я чувствую, что с PHP SoapClient просто нет способа сделать это, но мне любопытно, сможет ли кто-нибудь предложить какие-либо советы. FWIW, я не могу редактировать удаленный WDSL.
Любые идеи???