使用PHP在WSDL中使用奇怪的附加响应

时间:2012-10-19 00:27:58

标签: php web-services wsdl

我正在通过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 个答案:

答案 0 :(得分: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响应转换为schemaanyany只是XML内容的字符串版本。

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

答案 1 :(得分: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

答案 2 :(得分:0)

假设wsdl有效,我会尝试手动下载wsdl并将其保存为本地文件并以此方式访问它。我发现php中的soapClient并不是非常擅长使用wsdl的url,尤其是那些获取参数字符串的url。如果这适合你,那很好。由于肥皂是一种濒临死亡的宗教,我不希望这种情况很快得到解决。

如果你必须离开wsdl遥控器,你可以使用旧的nusoap库 - 虽然我从来没有见过任何人真正建立一个响应服务来自动更新我整个职业生涯中的wsdl变化......

答案 3 :(得分:0)

检查您的源代码,您认为附加的长文本有一些未显示的XML标记(您的浏览器不知道如何解释“&lt; Country&gt;”。也许他们希望您进一步解析它在使用之前?