使用SoapClient从PHP中获取WSDL元素

bil*_*oah 12 php xml soap wsdl ebay-api

我想从<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>
Run Code Online (Sandbox Code Playgroud)

我现在正在这样做:

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

这有效,但我想知道是否有一种方法可以使用PHP的SOAP扩展本地获取它?

我在想以下内容会起作用,但事实并非如此:

$client = new SoapClient($this->wsdl);
$version = $client->eBayAPIInterfaceService->Version;
Run Code Online (Sandbox Code Playgroud)

Ric*_*ote 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());
Run Code Online (Sandbox Code Playgroud)