Ну, так как у меня не было ничего лучше, я продолжал возиться с этим и понял это. У меня было большинство правильных элементов, только в неправильном порядке.
Мой WSDL остался прежним, мне не нужно было ничего там менять. В моем первом XSD я изменил свой выходной элемент на это:
<xs:element name="GetDictionaryResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetDictionaryResult" nillable="true" type="q2:DictionaryResponse" xmlns:q2="http://reachchallenges.infectionist.com/api/" />
</xs:sequence>
</xs:complexType>
</xs:element>
В основном я возвращаю объект DictionaryResponse с именем GetDictionaryResult из второго XSD, DictionaryResponse обернут в объект GetDictionaryResponse. Мой второй XSD был там, где я ошибался, SOAP сбивает с толку, но я получил следующие элементы:
<xs:complexType name="DictionaryResponse">
<xs:sequence>
<xs:element minOccurs="0" name="status" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="Data" type="tns:ArrayOfKeyValueOfintComment" />
</xs:sequence>
</xs:complexType>
<xs:element name="DictionaryResponse" nillable="true" type="tns:DictionaryResponse" />
<xs:complexType name="ArrayOfKeyValueOfintComment">
<xs:annotation>
<xs:appinfo>
<IsDictionary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">true</IsDictionary>
</xs:appinfo>
</xs:annotation>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="ArrayOfKeyValueOfintComment">
<xs:complexType>
<xs:sequence>
<xs:element name="Key" type="xs:int" />
<xs:element name="Value" nillable="true" type="tns:Comment" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfKeyValueOfintComment" nillable="true" type="tns:ArrayOfKeyValueOfintComment" />
Объект DictionaryResponse содержит строку с именем «status», которую я поместил туда только в качестве теста. Он также содержит неограниченные объекты ArrayOfKeyValueOfintComment, в которых происходит магия. Наконец, сам PHP:
class GetDictionaryResponse {
var $GetDictionaryResult;
function GetDictionaryResponse() {
$this->GetDictionaryResult = new GetDictionaryResult();
}
}
class GetDictionaryResult {
var $status;
var $Data;
function GetDictionaryResult() {
$this->status = (string)"Ok";
}
function AddItem($k, $v) {
$d = new ArrayOfKeyValueOfintComment($k, $v);
$this->Data[] = $d;
}
}
class ArrayOfKeyValueOfintComment {
var $Key, $Value;
function ArrayOfKeyValueOfintComment($k, $v) {
$this->Key = $k;
$this->Value = $v;
}
}
function GetDictionary() {
$ret = new GetDictionaryResponse();
for($i = 0; $i < 3; $i++) {
$c = new Comment(array([comment elements]));
$ret->GetDictionaryResult->AddItem($i, $c);
}
return $ret;
}
Надеюсь, это не выглядит слишком запутанным. По сути, возврат выглядит так:
GetDictionaryResponse->
GetDictionaryResult->
string status;
Dictionary<int, Comment> Data;
Я могу использовать его в .Net и получить из него действительный словарь, например:
DictionaryResponse r = client.GetDictionary ();
Комментарий c = r.Data [0];
Надеюсь, я помог некоторым будущим читателям!