好吧,既然我沒有更好的辦法,我一直在修補它並找出答案。我擁有大部分正確的元素,只是順序錯誤。
我的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>
基本上我返回從第二XSD命名GetDictionaryResult一個DictionaryResponse目的,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對象包含一個名爲「狀態」的字符串,我只把那裏作爲測試。它還包含一個無界的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;
我可以從淨消耗它,並得到了有效的解釋是這樣的:
DictionaryResponse R = client.GetDictionary(); 註釋c = r.Data [0];
希望我已經幫助了一些未來的讀者!