我正在通过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" }
正如您所看到的,以这种方式获取数组是没用的,因为所有内容都是附加的。 那么,这是使用这项服务的正确方法吗?
提前感谢。
答案 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响应转换为schema
和any
。 any
只是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;”。也许他们希望您进一步解析它在使用之前?