2015-10-13 113 views
12

我想從嵌套在WSDL的<service>塊中的<Version>元素中獲取文本。有問題的WSDL是Ebay的Trading api。有問題的片段看起來是這樣的:使用SoapClient從PHP獲取元素使用SoapClient獲取PHP中的元素

<wsdl:service name="eBayAPIInterfaceService"> 
    <wsdl:documentation> 
     <Version>941</Version> 
    </wsdl:documentation> 
    <wsdl:port binding="ns:eBayAPISoapBinding" name="eBayAPI"> 
     <wsdlsoap:address location="https://api.ebay.com/wsapi"/> 
    </wsdl:port> 
</wsdl:service> 

目前,我正在做這個:

$xml = new DOMDocument(); 
$xml->load($this->wsdl); 
$version = $xml->getElementsByTagName('Version')->item(0)->nodeValue; 

這工作,但我不知道是否有得到這個本地使用PHP的SOAP擴展的方法?

我的想法像下面這樣的工作,但它並不:

$client = new SoapClient($this->wsdl); 
$version = $client->eBayAPIInterfaceService->Version; 
+0

我認爲只發佈一個鏈接作爲一個答案是不好的形式,所以我反而評論。 我發現這個鏈接在學習如何使用SoapClient PHP類時非常有用,它提供了使用WSDL的例子。該類將數據作爲可以從中獲取數據的對象返回。 – crdunst

+0

@crdunst - 我沒有看到任何方式從SoapClient類中獲取該元素。我可以初始化客戶端,調用方法,獲取屬性等,但對於我的生活,我無法弄清楚如何訪問''。 wsdl在這裏公開可用http://developer.ebay.com/webservices/latest/ebaysvc.wsdl。如果你可以提供一個使用SoapClient的工作示例,這將是非常有用的。 – billynoah

+0

我開始爲你着想,但ebay API似乎比我一直在使用的API複雜得多。我發現這個答案雖然 - 它似乎有一個工作的例子:http://stackoverflow.com/questions/16502207/how-to-connect-to-the-ebay-trading-api-through-soapclient祝你好運。 – crdunst

回答

4

這是不可能做你想要與正規SoapClient什麼。你最好的選擇是擴展SoapClient類並抽象出這個需求來獲得版本。

請注意,file_get_contents未被緩存,因此它將始終加載WSDL文件。另一方面SoapClient緩存WSDL,所以你將不得不自己處理它。

也許看看NuSOAP。您將能夠修改,以滿足您的目的,而無需加載WSDL代碼兩次(當然你可以修改SoapClient的太但這是另一個冠軍;))

namespace Application; 

use DOMDocument; 

class SoapClient extends \SoapClient { 
    private $version = null; 

    function __construct($wsdl, $options = array()) { 
     $data = file_get_contents($wsdl); 

     $xml = new DOMDocument(); 
     $xml->loadXML($data); 
     $this->version = $xml->getElementsByTagName('Version')->item(0)->nodeValue; 

     // or just use $wsdl :P 
     // this is just to reuse the already loaded WSDL 
     $data = "data://text/plain;base64,".base64_encode($data); 
     parent::__construct($data, $options); 
    } 

    public function getVersion() { 
     return is_null($this->version) ? "Uknown" : $this->version; 
    } 
} 

$client = new SoapClient("http://developer.ebay.com/webservices/latest/ebaysvc.wsdl"); 
var_dump($client->getVersion()); 
+0

這與理想情況相差甚遠,比我已經做的事情要輕1000倍左右。但是,感謝所有提供一個想法。 – billynoah

0

您是否嘗試過使用simplexml_load_file?當我需要用php解析XML文件時爲我工作。

<?php 

$file = "/path/to/yourfile.wsdl"; 

$xml = simplexml_load_file($file) or die ("Error while loading: ".$file."\n"); 

echo $xml->service->documentation->Version; 

//if there are more Service-Elements access them via index 
echo $xml->service[index]->documentation->Version; 

//...where index in the number of the service appearing 
//if you count them from top to buttom. So if "eBayAPIInterfaceService" 
//is the third service-Element 
echo $xml->service[2]->documentation->Version; 



?> 
+0

這個問題特別涉及PHP SOAP客戶端,所以這個答案是不相關的,也是多餘的,因爲我已經演示了類似的東西,使用DOM Document可以正常工作。我修改了標題以使其更清楚。 – billynoah