2014-09-24 1 views
1

PHP-Script가 각 id-Element에 item-Tag를 출력하는 이유는 무엇입니까? 이 항목 - 래퍼는 필요하지 않으며 SOAP-WS 요청에 오류를 발생시킵니다. nusoap을 사용하고 있습니다.PHP는 SOAP 요청을 위해 item이라는 불필요한 XML-Tag를 생성합니다.

잘못된-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> 

올바른-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); 

아무도 아이디어가 있습니까?

감사합니다. 마리오

+0

최신 버전으로 급격한 변화가 없으면 NuSOAP의 배열 처리가 뚜렷하게 다릅니다. 하나 이상의 문자열 키가있는 배열의 기본 인코딩은 배열 키 다음에 이름이 지정된 XML 요소를 작성하여'array ('spaces ='1 '키)에 대해 유효하지 않은 XML을 생성하는 것입니다. 모든 숫자 키가있는 배열의 기본 인코딩은 비 순차적 인 경우에도 키가 중요하지 않다고 가정하고 ''노드 목록을 출력합니다. 상호 운용이 잘되지만 타사 서비스에 연결하려면 [내장 SOAPClient] (http://php.net/soapclient)를 사용하는 것이 좋습니다. – IMSoP

+0

이유는, NuSOAP을 사용했기 때문에 Multipart가 포함 된 XML 응답이고 기본 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));