Подтвердить что ты не робот

Получить элемент из 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;
4b9b3361

Ответ 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;



?>