我被这个似乎无法解决的错误所震惊。我得到一个XML无效,错误1002。
我已经在线检查了某些xml验证器,它们表明xml格式良好。xml是用来查询api的,但它似乎不起作用。
有人知道我做错了什么吗。
<SERVICE_SEARCH_REQUEST>
<VERSION_HISTORY>APPLICATION_NAME=AppName XML_FILE_NAME =XMLFileName LICENCE_KEY=xxx-3939-xxxx-xxxx-xxx TS_API_VERSION = TSAPIVersion>
<XML_VERSION_NO>3.0</XML_VERSION_NO>
</VERSION_HISTORY>
<GEO_LOCATION_NAME>London</GEO_LOCATION_NAME>
<START_DATE>12 Jan 16</START_DATE>
<NUMBER_OF_NIGHTS>1</NUMBER_OF_NIGHTS>
<AVAILABLE_ONLY>TRUE</AVAILABLE_ONLY>
<GET_START_PRICE>true</GET_START_PRICE>
<ROOM_REPLY>
<ANY_ROOM/>
</ROOM_REPLY>
<ROOMS_REQUIRED>
<ROOM>
<OCCUPANCY>2</OCCUPANCY>
<QUANTITY>1</QUANTITY>
</ROOM>
<ROOM>
<OCCUPANCY>3</OCCUPANCY>
<QUANTITY>1</QUANTITY>
</ROOM>
</ROOMS_REQUIRED>
</SERVICE_SEARCH_REQUEST>
我得到的回复是:
Array ( [@attributes] => Array ( [CATEGORY] => XML Validation ) [VERSION_HISTORY] => Array ( [@attributes] => Array ( [APPLICATION_NAME] => AppName [XML_FILE_NAME] => XMLFileName [LICENCE_KEY] => LicenceKey [TS_API_VERSION] => TSAPIVersion ) [XML_VERSION_NO] => XMLVersionNumber ) [ERROR_NUMBER] => 1002 [ERROR_DESC] => XML is not valid )
更新的php用法:
$header[] = "Accept: application/xml";
$ch = curl_init();
curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch,CURLOPT_POST,5);
curl_setopt($ch,CURLOPT_POSTFIELDS,$XML);
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
$response = curl_exec($ch);
$response = simplexml_load_string($response);
//$desired_array = json_decode(json_encode((array);
print_r($response);
?>
更新错误:
警告:simplexml_load_string():实体:第1行:分析器错误:文档标记为UTF-16,但第36行有UTF-8内容
警告:simplexml_load_string():第36行的<?xml version="1.0" encoding="UTF-16"?><SERVICE_SEARCH_RESPONSE><VERSION_HISTORY
警告:第36行上的simplexml_load_string():^
此行:
<VERSION_HISTORY>APPLICATION_NAME=AppName XML_FILE_NAME =XMLFileName LICENCE_KEY=xxx-3939-xxxx-xxxx-xxx TS_API_VERSION = TSAPIVersion>
不是有效的XML。>
没有关闭元素。您可能希望将这些值作为属性。尝试:
<VERSION_HISTORY APPLICATION_NAME='"AppName'" XML_FILE_NAME ='"XMLFileName'" LICENCE_KEY='"xxx-3939-xxxx-xxxx-xxx'" TS_API_VERSION = '"TSAPIVersion'">
根据您的更新,我在这里转义了双引号,因为听起来您在PHP中使用双引号封装字符串。或者,您可以使用单引号。
<VERSION_HISTORY APPLICATION_NAME='AppName' XML_FILE_NAME ='XMLFileName' LICENCE_KEY='xxx-3939-xxxx-xxxx-xxx' TS_API_VERSION = 'TSAPIVersion'>
在这两种情况下都使用PHP,如
$xml = "<VERSION_HISTORY APPLICATION_NAME='AppName' XML_FILE_NAME ='XMLFileName' LICENCE_KEY='xxx-3939-xxxx-xxxx-xxx' TS_API_VERSION = 'TSAPIVersion'>";
或
$xml = "<VERSION_HISTORY APPLICATION_NAME='"AppName'" XML_FILE_NAME ='"XMLFileName'" LICENCE_KEY='"xxx-3939-xxxx-xxxx-xxx'" TS_API_VERSION = '"TSAPIVersion'">";
应有效。