2015-10-13 23 views
12

Vorrei ottenere il testo dall'elemento <Version> che è annidato all'interno del blocco <service> di un WSDL. Il WSDL in questione è Ebay Trading api. Il frammento in questione simile a questa:Ottieni elemento da WSDL in PHP utilizzando SoapClient

<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> 

Attualmente sto facendo questo:

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

Questo funziona, ma mi chiedo se c'è un metodo per ottenere questo modo nativo con estensione SOAP di PHP ?

Stavo pensando qualcosa di simile al seguente avrebbe funzionato ma non è così:

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

Penso che pubblicare solo un collegamento come risposta sia una cattiva forma, quindi sto commentando. Ho trovato questo link molto utili per imparare a utilizzare la classe PHP SoapClient http://devzone.zend.com/2202/php-and-soap-first-steps/ Esso fornisce esempi in utilizzando un WSDL. Quella classe restituisce i dati come un oggetto da cui puoi prelevare i dati. – crdunst

+0

@crdunst - Non vedo alcun modo per ottenere quell'elemento dalla classe SoapClient. Posso inizializzare il client, chiamare metodi, ottenere proprietà, ecc. Ma per la vita di me non riesco a capire come accedere a ''. Wsdl è disponibile pubblicamente qui http://developer.ebay.com/webservices/latest/ebaysvc.wsdl. Se è possibile fornire un esempio funzionante con SoapClient che sarebbe molto utile. – billynoah

+0

Ho iniziato a guardarlo per te, ma l'API di ebay sembra infinitamente più complessa dell'API con cui ho lavorato. Ho trovato questa risposta SO - sembra avere un esempio funzionante: http://stackoverflow.com/questions/16502207/how-to-connect-to-the-ebay-trading-api-through-soapclient Buona fortuna. – crdunst

risposta

4

Non è possibile fare ciò che si vuole con la regolare SoapClient. La soluzione migliore è estendere la classe SoapClient e astrarre questo requisito per ottenere la versione.

Si prega di notare che file_get_contents non è memorizzato nella cache, quindi caricherà sempre il file WSDL. D'altra parte SoapClient memorizza nella cache il WSDL in modo che tu debba occupartene da solo.

Forse guarda in NuSOAP. Sarete in grado di modificare il codice in base alle proprie finalità senza caricare il WSDL due volte (ovviamente si è in grado di modificare troppo SoapClient ma questo è un altro campionato;))

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

Questo è lontano dall'ideale e circa 1000 volte più ingombrante di quello che sto già facendo. Ma grazie ugualmente per aver contribuito a un'idea. – billynoah

0

Hai provato simplexml_load_file? Ha funzionato per me quando avevo bisogno di analizzare un file XML con php.

<?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

La domanda riguarda specificamente PHP SOAP Client, quindi questa risposta non è rilevante e anche ridondante dato che ho già dimostrato qualcosa di simile che funziona bene con DOM Document. Ho rivisto il titolo per renderlo più chiaro. – billynoah