2

私はphpを介してこのWebサービスを使用しています

$wsdl = 'http://www.ezzylearning.com/services/CountryInformationService.asmx?wsdl';
$soap = new soapClient($wsdl);
try{
$return = $soap->GetCountriesByContinent(array('continentCode'=>'AS'));
} catch (Exception $e) {
    die ('Error: ' . $e->getMessage());
}
var_dump($return->GetCountriesByContinentResult);

私はこの結果を得ています:

object(stdClass)#3 (2) { ["schema"]=> string(607) "" ["any"]=> string(6747) "AFAFGAfghanistanAMARMArmeniaAZAZEAzerbaijanBHBHRBahrainBDBGDBangladeshBTBTNBhutanIOIOTBritish Indian Ocean TerritoryBNBRNBruneiKHKHMCambodiaCNCHNChinaCXCXRChristmas IslandCCCCKCocos IslandsGEGEOGeorgiaHKHKGHong KongININDIndiaIDIDNIndonesiaIRIRNIranIQIRQIraqILISRIsraelJPJPNJapanJOJORJordanKZKAZKazakhstanKWKWTKuwaitKGKGZKyrgyzstanLALAOLaosLBLBNLebanonMOMACMacaoMYMYSMalaysiaMVMDVMaldivesMNMNGMongoliaMMMMRMyanmarNPNPLNepalKPPRKNorth KoreaOMOMNOmanPKPAKPakistanPSPSEPalestinian TerritoryPHPHLPhilippinesQAQATQatarSASAUSaudi ArabiaSGSGPSingaporeKRKORSouth KoreaLKLKASri LankaSYSYRSyriaTWTWNTaiwanTJTJKTajikistanTHTHAThailandTRTURTurkeyTMTKMTurkmenistanAEAREUnited Arab EmiratesUZUZBUzbekistanVNVNMVietnamYEYEMYemen" }

ご覧のとおり、すべてが追加されるため、この方法で配列を取得しても意味がありません。では、このサービスを利用する正しい方法はどれでしょうか?

前もって感謝します。

4

4 に答える 4

1

非常に単純な XML 出力として、次のようなものを試すことができます

$wsdl = 'http://www.ezzylearning.com/services/CountryInformationService.asmx?wsdl';
$soap = new soapClient($wsdl);
try {
    $return = $soap->GetCountriesByContinent(array('continentCode' => 'AS'));
    $xml = new SimpleXMLElement($return->GetCountriesByContinentResult->any);

    echo "<pre>";
    echo "ISO2\tISO3\tCountry Name\n";
    foreach ( $xml->NewDataSet->Countries as $country ) {
        printf("%s\t%s\t%s\n", $country->ISO2, $country->ISO3, $country->Country);
    }
} catch ( Exception $e ) {
    die('Error: ' . $e->getMessage());
}

出力

ISO2    ISO3    Country Name
AF  AFG Afghanistan
AM  ARM Armenia
AZ  AZE Azerbaijan
BH  BHR Bahrain
BD  BGD Bangladesh
BT  BTN Bhutan
IO  IOT British Indian Ocean Territory
BN  BRN Brunei
KH  KHM Cambodia
CN  CHN China
CX  CXR Christmas Island
CC  CCK Cocos Islands
GE  GEO Georgia
HK  HKG Hong Kong
IN  IND India
ID  IDN Indonesia
IR  IRN Iran
IQ  IRQ Iraq
IL  ISR Israel
JP  JPN Japan
JO  JOR Jordan
KZ  KAZ Kazakhstan
KW  KWT Kuwait
KG  KGZ Kyrgyzstan
LA  LAO Laos
LB  LBN Lebanon
MO  MAC Macao
MY  MYS Malaysia
MV  MDV Maldives
MN  MNG Mongolia
MM  MMR Myanmar
NP  NPL Nepal
KP  PRK North Korea
OM  OMN Oman
PK  PAK Pakistan
PS  PSE Palestinian Territory
PH  PHL Philippines
QA  QAT Qatar
SA  SAU Saudi Arabia
SG  SGP Singapore
KR  KOR South Korea
LK  LKA Sri Lanka
SY  SYR Syria
TW  TWN Taiwan
TJ  TJK Tajikistan
TH  THA Thailand
TR  TUR Turkey
TM  TKM Turkmenistan
AE  ARE United Arab Emirates
UZ  UZB Uzbekistan
VN  VNM Vietnam
YE  YEM Yemen
于 2012-10-19T00:59:28.170 に答える
1

WSDL 定義は、SoapClient が要求を形成し、応答を解釈する方法を決定します。

アクセスしようとしているメソッドには、次のように定義された応答があります。

<s:element name="GetCountriesByContinentResponse">
  <s:complexType>
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="GetCountriesByContinentResult">
        <s:complexType>
          <s:sequence>
            <s:element ref="s:schema" />
            <s:any />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:sequence>
  </s:complexType>
</s:element>

したがって、PHP は XML 応答をschemaおよびに変換していますanyanyXML コンテンツの単なる文字列バージョンです。

の内容はany有効な XML である必要があるため、WDSL を変更できない場合は、いつでも XML パーサーで文字列を読み取ることができます。

于 2012-10-19T00:46:11.780 に答える
0

wsdl が有効であると仮定すると、wsdl を手動でダウンロードしてローカル ファイルとして保存し、その方法でアクセスしようとします。私は、php の soapClient が wsdl の URL、特にパラメーター文字列を取得する URL を消費するのにあまり適していないことを発見しました。これがうまくいくなら、素晴らしいです。石鹸は死につつある宗教なので、これがすぐに修正されるとは思いません。

wsdl リモートを離れる必要がある場合は、古い nusoap ライブラリを使用できますが、wsdl の変更に応じて自動的に更新されるレスポンシブ サービスを実際に構築した人は、私のキャリア全体で見たことがありません...

于 2012-10-19T00:35:56.323 に答える
0

ソース コードを確認してください。追加されたと思われる長いテキストには、表示されない XML タグが含まれています (お使いのブラウザは、"<Country>" を解釈する方法を認識していません。使用する前にさらに解析する必要があるのではないでしょうか?

于 2012-10-19T00:37:12.220 に答える