2011-07-15 4 views
1

PHP5とCodeigniterを使用して、SOAPリクエストを介して.NET Webサービスに接続しています。そのデータセットを更新するのに問題があります。これはCodeigniter(ここではあまり重要視していませんが)、SOAP、PHP SimpleXMLクラス、および.NET Webサービスの一般的な作業です。たとえば、これはユーザープロファイルを更新するためのものです。私はレスポンスを得るのに何の問題もありませんが、ユーザーのプロファイルの編集に基づいてこれを更新する方法がわかりません。PHPでXMLを更新してSOAPで.NET Webサービスデータセットに戻す

ダンピング要求から私の文字列がこれです(注:私は、データセットの開始である0、と心配1111は、ユーザ名で、次の1111はパスワードです)

11111111 0RandyFloydGM1955- 11-05T00:00:00-04:00317787129131789770001910 E. Markwood AvenueIndianapolisIN46227falsefalse

これは私に400 Bad Requestエラーを与えます。明らかに、0と最後の1の間のスペースが原因です.htmlspecialchars()を実行することによって、xml宣言が不要なように見えます。

元の応答を取って、これを更新して返信するだけで、このように動作します。 111111110RandyFloydGM1955-11-05T00:00:00-04:00317787129131789770001910 E. Markwood AvenueIndianapolisIN46227falsefalse

とはhtmlspecialcharsとは、()は、この(XML宣言)のようになります。ここでは

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml- msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><dsEmployee xmlns="http://SHSSrv/dsEmployee.xsd"><Employee diffgr:id="Employee1" msdata:rowOrder="0"><EmplId>0</EmplId><FirstName>Randy</FirstName><LastName>Floyd</LastName><MI>G</MI><Sex>M</Sex><DOB>1955-11-05T00:00:00-04:00</DOB><HomePhoneArea>317</HomePhoneArea><HomePhone>7871291</HomePhone><WorkPhoneArea>317</WorkPhoneArea><WorkPhone>8977000</WorkPhone><Address1>1920 E. Markwood Avenue</Address1><Address2/><City>Indianapolis</City><St>IN</St><ZIP>46227</ZIP><ReceiveNewsLetter>false</ReceiveNewsLetter><PagerArea/><PagerNo/><EmailAddress>[email protected]</EmailAddress><SpanishContact>false</SpanishContact></Employee></dsEmployee></diffgr:diffgram> 

はコードです:

function employee_update_request() 
{ 

    ini_set('soap.wsdl_cache_ttl' , 0); 

    //Get XML from the Employee Profile Request 
    $response = $this->employee_profile_request(); 

    //Turn the string into an object to manipulate 
    $dataset = simplexml_load_string($response->any); 

    //Manipulate some data from the update form 
    $dataset->dsEmployee->Employee->EmailAddress = "[email protected]"; 
    $dataset->dsEmployee->Employee->Address1 = "1920 E. Markwood Avenue"; 
    $any = $dataset->saveXML(); 

    //Add back the string to the original response object returned from web service   
    $response->any = $any; 

    //Get username and password for the params 
    $username = $this->session->userdata('username'); 
    $password = $this->session->userdata('password');      
    $params = array('sUserId' => $username, 'sPassword' => $password, 'dsEmployee' => $response); 

    //SOAP Options 
    $options = array(
      'soap_version'=>SOAP_1_1, 
      'exceptions'=> 0, 
      'trace'=> 1, 
     'uri' => "http://www.w3.org/2003/05/soap-envelope" 
      ); 

     //New soap client with options 
     $client = new SoapClient('http://localhost/SHSSRV/SHSSrv.asmx?WSDL', $options); 
     //Request the employee profile fromt the webservice, passing in credentials 

     $update_request = $client->EmployeeUpdateRequest($params); 
     $update_response = $update_request->EmployeeUpdateRequestResult; 

     return $update_response; 

} 

私は本当に助けが必要です。このデータをどのように更新するのが最適かを理解する必要があります。宣言を何とか取り除くことができますか、.NET Webサービスを何らかの方法で変更するように要求する必要がありますか?私はそれに直接アクセスすることはできませんが、一緒にもっと良い方法があれば、開発者と話すことができます。

ありがとうございます!

答えて

0

私はこれを行うことでこれを解決しました。私は良い方法があるかどうかを知りたいです。

$no_xml_doctype = str_replace('<?xml version="1.0"?>' , '' , $any); 
$trimmed = trim($no_xml_doctype); 
$response->any = $trimmed; 

//Get username and password for the params 
$username = rtrim($this->session->userdata('username')); 
$password = rtrim($this->session->userdata('password'));       
$params = array('sUserId' => $username, 'sPassword' => $password, 'dsEmployee' => $response); 
関連する問題