2012-08-06 25 views
1

在我SoapClient的情況下,請求XML應該是這樣的:如何構建KeyValuePair在PHP的SoapClient的

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"> 
<SOAP-ENV:Body> 
    <SoapFunction xmlns="http://services.***/"> 
     <prop1>value1</prop1> 
     <prop2>value2</prop2> 
     <prop3> 
      <KeyValuePair> 
       <Key>string</Key> 
       <Value>string</Value> 
      </KeyValuePair> 
      <KeyValuePair> 
       <Key>string</Key> 
       <Value>string</Value> 
      </KeyValuePair> 
     </prop3> 
    </SoapFunction> 
</SOAP-ENV:Body> 
</sSOAP-ENV:Envelope> 

我可以通過下面的代碼建立正確PROP1和PROP2:

$parameters = array(
    'prop1' => value1, 
    'prop2' => value2 
); 
$request = array($parameters); 
$client->__soapCall('SoapFunction', $request); 

但我怎麼能建立財產prop3,尤其是構造型KeyValuePair這是在WSDL文件中定義

回答

1

根據在WSDL文件中的定義

<s:complexType name="KeyValuePair"> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="Key" type="s:string" /> 
     <s:element minOccurs="0" maxOccurs="1" name="Value" type="s:string" /> 
    </s:sequence> 
</s:complexType> 

我創建了一個新的類KeyValuePair擁有的財產「鍵」和「值」。 那麼我可以用一個SoapVar是這樣

$kvp1= new SoapVar(new KeyValuePair('key1', 'value1'), XSD_ANYTYPE, 'KeyValuePair'); 
$kvp2= new SoapVar(new KeyValuePair('key2', 'value2'), XSD_ANYTYPE, 'KeyValuePair'); 
$parameters = array(
    'prop1' => value1, 
    'prop2' => value2, 
    'prop3' => array($kvp1, $kvp2) 
); 
$request = array($parameters); 
$client->__soapCall('SoapFunction', $request); 

BTW的prop3:如果生成的XML請求有一個你想要的垃圾的區別,你可以覆蓋SoapClient的的__doRequest做一些的preg_replace等

0

您可以生成你喜歡該R XML字符串,然後把它傳遞給你的soapFunction

<?php 
$prop1="prop1 value"; 
$prop2="prop2 value"; 
$prop3Values=array(); 
$prop3Values["key1"]="value1"; 
$prop3Values["key2"]="value2"; 
$prop3Values["key3"]="value3"; 
$prop3Values["key3"]="value3"; 
$prop3==""; 

foreach($prop3Values as $k=>$v) 
{ 
if($prop3=="") 
{ 
$prop3.="<KeyValuePair> 
     <Key>$k</Key> 
     <Value>$v</Value> 
    </KeyValuePair>"; 
} 
else 
{ 
    $prop3.=" 
    <KeyValuePair> 
     <Key>$k</Key> 
     <Value>$v</Value> 
    </KeyValuePair>"; 
} 
} 

$xml=<<<XML 
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"> 
<SOAP-ENV:Body> 
<SoapFunction xmlns="http://services.***/"> 
    <prop1>$prop1</prop1> 
    <prop2>$prop2</prop2> 
    <prop3> 
    $prop3 
    </prop3> 
</SoapFunction> 
</SOAP-ENV:Body> 
</sSOAP-ENV:Envelope> 
XML; 
echo $xml; 
?> 

在變量$ XML是你的格式化字符串

+0

當然,這個解決方案應該可以工作,但我必須找到插入KeyValuePair節點的正確位置,這不是動態和靈活的 – Hyden 2012-08-07 01:08:31