2015-10-13 10 views
12

Chciałbym uzyskać tekst z elementu <Version>, który jest zagnieżdżony w bloku WSDL <service>. WSDL, o którym mowa, to aplikacja Ebay: Trading api. Fragment w pytaniu wygląda mniej więcej tak:Pobierz element z WSDL w PHP za pomocą 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> 

Jestem obecnie to robi:

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

To działa, ale zastanawiam się, czy istnieje sposób, aby uzyskać ten natywnie przy użyciu rozszerzenia SOAP PHP ?

myślałem coś takiego będzie pracować poniżej ale nie:

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

Wydaje mi się, że umieszczanie linku jako odpowiedzi to zła forma, więc zamiast tego komentuję. Znalazłem ten link naprawdę przydatne w nauce korzystania z klasy PHP SoapClient http://devzone.zend.com/2202/php-and-soap-first-steps/ Podaje przykłady przy użyciu WSDL. Ta klasa zwraca dane jako obiekt, z którego można pobrać dane. – crdunst

+0

@crdunst - Nie widzę żadnego sposobu na uzyskanie tego elementu z klasy SoapClient. Mogę zainicjować klienta, wywołać metody, uzyskać właściwości, itp. Ale dla mojego życia nie mogę wymyślić, jak uzyskać dostęp do ''. Plik wsdl jest dostępny publicznie tutaj http://developer.ebay.com/webservices/latest/ebaysvc.wsdl. Jeśli możesz podać przykład pracy przy użyciu SoapClient, byłoby to bardzo pomocne. – billynoah

+0

Zacząłem na ciebie patrzeć, ale API serwisu eBay wydaje się nieskończenie bardziej skomplikowane niż API, z którym pracowałem. Znalazłem tę odpowiedź SO - wydaje się, że ma działający przykład: http://stackoverflow.com/questions/16502207/how-to-connect-to-the-ebay-trading-api-through-soapclient Powodzenia. – crdunst

Odpowiedz

4

Nie jest możliwe, aby robić to, co chcesz z regularną SoapClient. Najlepszym wyjściem jest rozszerzenie klasy SoapClient i odkreślenie tego wymogu, aby uzyskać wersję.

Należy pamiętać, że file_get_contents nie jest buforowany, więc zawsze będzie ładował plik WSDL. Z drugiej strony SoapClient buforuje WSDL, więc sam będziesz musiał sobie z tym poradzić.

Być może zajrzyj do NuSOAP. Będziesz mógł zmodyfikować kod do własnych celów bez ładowania WSDL dwa razy (oczywiście jesteś w stanie modyfikować SoapClient też, ale to już inna mistrzostwa;))

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

Jest to dalekie od ideału i około 1000 razy bardziej uciążliwe niż to, co już robię. Ale dziękuję za wniesienie idei. – billynoah

0

Czy próbowałeś simplexml_load_file? Pracował dla mnie, gdy potrzebowałem parsować plik XML z 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

Pytanie dotyczy konkretnie klienta PHP SOAP, więc ta odpowiedź nie jest istotna, a także zbędna, ponieważ zademonstrowałem już coś podobnego, co działa poprawnie przy użyciu dokumentu DOM. Poprawiłem tytuł, aby było to bardziej jasne. – billynoah

Powiązane problemy