2014-09-24 3 views
1

Почему мой PHP-Script выводит элемент-тег для каждого элемента id? Этот элемент-обертка не нужен, он дает ошибку в запросе SOAP-WS. Я использую nusoap.PHP создает ненужный XML-тег, называемый элементом для запроса SOAP

Неправильные XML:

<SOAP-ENV:Envelope> 
    <SOAP-ENV:Body> 
     <ns2475:uploadMetaData xmlns:ns2475="..."> 
      <uploadMetaData> 
       <mediaNumber xsi:type="xsd:string">906</mediaNumber> 
       <associations xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="unnamed_struct_use_soapval[2]"> 
        <item> 
         <id xsi:type="xsd:int">1</id> 
        </item> 
        <item> 
         <id xsi:type="xsd:string">5</id> 
        </item> 
       </associations> 
      </uploadMetaData> 
     </ns2475:uploadMetaData> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Correct-XML:

<SOAP-ENV:Envelope> 
    <SOAP-ENV:Body> 
     <ns2475:uploadMetaData xmlns:ns2475="..."> 
      <uploadMetaData> 
       <mediaNumber xsi:type="xsd:string">906</mediaNumber> 
       <associations xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="unnamed_struct_use_soapval[2]"> 
         <id xsi:type="xsd:int">1</id> 
         <id xsi:type="xsd:string">5</id> 
       </associations> 
      </uploadMetaData> 
     </ns2475:uploadMetaData> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

PHP-код:

$associationslist = array(); 
foreach($xml->xpath('//associations') as $association) {   
    // add existing themes to list 
    array_push($associationslist, array('id'=>$association->id)); 
} 
// add one after looping 
array_push($associationslist, array('id'=>$themeid)); 
$client_mediapool->call('uploadMetaData',array('uploadMetaData'=>array('mediaNumber'=>$mediaid,'associations'=>$associationslist)), $ns); 

Есть ли у кого-нибудь идеи?

спасибо. Mario

+0

Если последние версии не вступили в радикальные изменения, обработка NuSOAP массивов явно неустойчива. Его кодировка по умолчанию для массива с хотя бы одним строковым ключом заключается в создании XML-элементов, названных после ключей массива, таким образом генерируя недопустимый XML для 'array ('key with spaces' => 1)'. Его кодировка по умолчанию для массива со всеми цифровыми клавишами предполагает, что ключи не имеют значения, даже если они не являются последовательными, и выводят список узлов ''. Он взаимодействует с самим собой, но для подключения к сторонней службе вам лучше использовать [встроенный 'SOAPClient'] (http://php.net/soapclient). – IMSoP

+0

Причина, по которой я использовал NuSOAP, - это XML-ответ с Multipart, а собственный SOAPClient не поддерживает Multipart/Related XOP. Тем не менее, я удалил NuSOAP сейчас и снова использовал SOAPClient, но сначала я удаляю все ненужные коды, расширяя SOAPClient. – marioa

ответ

0

Извлечение NuSoap agian и расширение родного клиента очень помогает.

class MySoapClient extends SoapClient 
{ 
public function __doRequest($request, $location, $action, $version, $one_way = 0) 
{ 
$response = parent::__doRequest($request, $location, $action, $version, $one_way); 
// parse $response, extract the multipart messages and so on 
//this part removes stuff 
$start=strpos($response,'<soap:Envelope'); 
$end=strrpos($response,'</soap:Envelope>'); 
$response_string=substr($response,$start,$end-$start+16); 
return($response_string); 
} 
} 

$wsdl = array(); 
$wsdl_url = '.../?wsdl'; 
$auth = 'SOAP_AUTHENTICATION_BASIC'; 
$login = '...'; 
$password = '...'; 
$trace = true; 
$location = '.../'; 
$client = new MySoapClient($wsdl_url, array('authentication' => $auth, 'login' => $login, 'password' => $password, 'trace' => $trace,'location'=>$location));