2015-10-13 9 views
12

<Version>要素のテキストをWSDLの<service>ブロック内にネストしたいと思います。問題のWSDLは、Ebayの取引 apiです。問題のスニペットは、このようなものになります。SoapClientを使用してPHPでWSDLの要素を取得する

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

これは動作しますが、このネイティブに使用してPHPのSOAP拡張モジュールを取得する方法がある場合、私は思ったんだけど:

<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> 

を私は現在、これをやっています?

私は仕事と次のようなものを考えていたが、それはしていません:

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

私は答えとしてリンクを投稿するのは悪いフォームなので、私は代わりにコメントしています。 SoapClient PHPクラスの使い方を学ぶ上でこのリンクが本当に便利だと分かりました。 http://devzone.zend.com/2202/php-and-soap-first-steps/ WSDLの使用例を示します。そのクラスは、データを取得できるオブジェクトとしてデータを返します。 – crdunst

+0

@crdunst - SoapClientクラスからその要素を取得する方法はありません。私はクライアントを初期化し、メソッドを呼び出し、プロパティを取得することができますが、私の人生では、 ''にアクセスする方法を理解できません。 wsdlはhttp://developer.ebay.com/webservices/latest/ebaysvc.wsdlで公開されています。非常に有用なSoapClientを使用して実例を提供できる場合 – billynoah

+0

私はあなたのためにそれを見始めたが、イーベイのAPIは私が働いていたAPIよりも無限に複雑であるようだ。私はこのSOの答えを見つけました - それは実際の例があるようです:http://stackoverflow.com/questions/16502207/how-to-connect-to-the-ebay-trading-api-through-soapclient幸運。 – crdunst

答えて

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()); 
+0

これは理想とはかけ離れており、私がすでにやっているよりも約1000倍も面倒です。しかし、アイデアを寄稿してくれてありがとう。 – billynoah

0

あなたはsimplexml_load_fileを試みたことがありますか?私がPHPでXMLファイルを解析する必要があるときに私のために働いた。

+0

質問は特にPHP SOAPクライアントに関連しているので、この回答は関連性がなく、冗長でもありません。私はこれをより明確にするためにタイトルを改訂しました。 – billynoah

関連する問題