[英]Get element from WSDL in PHP using SoapClient
我想从<Version>
元素中获取文本,该元素嵌套在WSDL的<service>
块中。 有问题的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;
使用常规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());
你试过simplexml_load_file吗? 当我需要用php解析XML文件时,为我工作。
<?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;
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.