2012-06-17 72 views
2

我努力讓PHP的內置SoapClient解釋我試圖調用的Web服務返回的響應。PHP SoapClient沒有將XML響應解釋爲數組

SoapUI能夠詢問此soap方法並返回良好結果。 我也能得到nusoap_client返回正確的結果(但由於其他原因,我不能使用nusoap,並認爲我被卡住了SoapClient)。

使用SoapClient,我可以看到看起來好的數據正在返回,但不是結果被解析並分解爲容易消耗的值數組,而是將XML響應字符串填充到對象中的單個字段中'任何')。

我的代碼和結果如下所示:

$client = new SoapClient($url); 
$results = $client->GetPropertiesByProjectAndContractStatus($params); 
var_dump($results); 

從上面的代碼的輸出如下:

object(stdClass)[3] 
    public 'GetListingsByGUIDResult' => 
    object(stdClass)[4] 
     public 'any' => string '<xs:schema xmlns="" ........ (long xml here) .... 

現在,也許它可能是我使用的服務返回一些XML它有什麼問題(雖然對我來說似乎很好)。 nusoapSoapUI都沒有使用它的問題。

所以我想知道它與SoapClient是什麼不同。

回答

0

您是否嘗試過使用SOAP_SINGLE_ELEMENT_ARRAYS feature

<?php 
$client = new SoapClient($url, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS)); 
+0

嗨,彼得,謝謝你的迴應!包括這對結果沒有任何影響。 –

+0

你有沒有想過克里斯? –

1

我有抓住這一結果,並把它變成一個DOM對象,所以你可以使用DOM函數來提取數據的功能。

protected function getElementsFromResult($elementName, $simpleresult) { 
    $dom = new DOMDocument(); 
    $dom->preserveWhiteSpace = FALSE; 
    if ($simpleresult == null) { 
    echo 'null'; 
    return null; 
    } else { 
    $dom->loadXML ($simpleresult->any); 
    return $dom->getElementsByTagName ($elementName); 
    } 

$elementName是你的結果要與$simpleresult是包含「任何」字符串對象中的元素的名稱。

1

當您正在使用的WSDL中沒有指定返回的數據時,會發生這種情況。任何不在WSDL中的東西都會在解析XML時結束到這個「任何」元素。

如果發生這種情況,那麼您應該確保腳本使用正確的WSDL作爲您正在使用的SOAP服務。

例如,如果您使用的是舊的WSDL,並且現在正在服務中使用新元素,則它們將在此「任何」元素內結束!