Получить элемент из WSDL в PHP с помощью SoapClient
Я хочу получить текст из элемента <Version>
, который вложен внутри блока <service>
WSDL. WSDL, о котором идет речь, - Ebay Торговля api. Этот фрагмент выглядит примерно так:
<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;
Ответы
Ответ 1
Невозможно выполнить то, что вы хотите, с помощью обычного 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());
Ответ 2
Вы пробовали файл simplexml_load_file? Работал для меня, когда мне нужно было разбирать XML файл с помощью 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;
?>