2012-05-10 168 views
0

我試圖創造適宜的基於WSDL的SOAP請求,但沒有成功適當的SOAP XML請求,我這裏是什麼,我需要: soap.xml:不能產生通過PHP

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
     <AuthMember xmlns="http://tempuri.org/"> 
      <somefield>string</somefield> 
     </AuthMember> 
    </soap:Header> 
    <soap:Body> 
     <AuthenticateMember xmlns="http://tempuri.org/" /> 
    </soap:Body> 
</soap:Envelope> 

我結果是: soap.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"    xmlns:ns1="http://tempuri.org/" xmlns:ns2="http://schemas.xmlsoap.org/ws/2002/07/utility"> 
<SOAP-ENV:Header> 
    <ns2:AuthMember> 
     <somefield>somefieldvalue</somefield> 
    </ns2:AuthMember> 
</SOAP-ENV:Header> 
<SOAP-ENV:Body> 
    <ns1:AuthenticateMember/> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

這是我的PHP代碼:



    class SoapHeaderAuthMember 
    { 

     public $somefield; 

     public function __construct($somefield) 
     { 

      $this->somefield = $somefield;   

     } 
    } 

    $client = new SoapClient('https://www.somepage.com/service.asmx?WSDL', 
     array("exceptions"=>0, "trace" => 1) 
    ); 
    $authMember = new SoapHeaderAuthMember('somefieldvalue'); 


    $soapHeaders[] = new SoapHeader('http://schemas.xmlsoap.org/ws/2002/07/utility', 'AuthMember', $authMember); 
    $client->__setSoapHeaders($soapHeaders);     

    $client->__soapCall('AuthenticateMember',array()); 

 

看到,

1.it生成SOAP-ENV:信封代替SOAP-ENV:信封

2.in頭:我有NS2:AuthMember代替AuthMember

3。在身體我有NS1:AuthenticateMember而不是AuthenticateMember xmlns =「http://tempuri.org/」

我怎樣才能得到正確的XML?我已經瀏覽了php函數手冊,找不到答案,谷歌搜索沒有給我成功的結果,我的情況。

你能幫忙嗎?

回答

1

已經產生的結果是什麼代碼被請求,但命名空間的某些屬性的解釋是爲了:

每個XML文檔中的標籤都有一個完全合格的形式由名稱空間和標記名稱定義(即使它位於「默認」名稱空間中,但沒有明確的名稱空間聲明)。完全限定版本通常寫爲{namespace}標記。通過解析完全限定名稱,可以確定兩個元素的表示是否相同。

命名空間與以多種方式元件,包括明確的名稱空間包括與所述元件相關聯

Example: 
<AuthMember xmlns="http://tempuri.org/"> 
resolving to fully-qualified name {http://tempuri.org/}AuthMember 

和通過命名空間相關聯的前綴

Example: 
<... xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
resolving to {http://schemas.xmlsoap.org/soap/envelope/}Header 

的前綴是在範圍爲元件,其中前綴被聲明和任何包含的元素。實際使用的前綴並不重要(肥皂SOAP-ENVrandomprefix可用於http://schemas.xmlsoap.org/soap/envelope/命名空間),但好的做法是使用有意義的東西

鑑於此,「期望」和「實際」文檔中的完全限定元素幾乎相同,異常是頭元素AuthMember。根據您的需要,您可以指定一個名稱空間http://tempuri.org/,以獲得完全合格的{http://tempuri.org/}AuthMember。在實際中,前綴關聯結果爲完全合格的{http://schemas.xmlsoap.org/ws/2002/07/utility}AuthMember

這是SoapHeader實例化的結果,它指定了AuthMember的... utility命名空間。在您的代碼中更改該語句以使用名稱空間應該會導致實際的文檔與所需的匹配。

+0

非常感謝!你是對的,我已經將命名空間改爲http://tempuri.org/,它起作用了! – dave101ua