2

我正在通过 php 使用这个网络服务

$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

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 响应转换schemaany. any只是 XML 内容的字符串版本。

的内容any应该是有效的 XML,因此如果您无法修改 WDSL,您始终可以使用 XML 解析器读取字符串。

于 2012-10-19T00:46:11.780 回答
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 回答
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 回答