PHP - удаление странных символов из XML - PullRequest
0 голосов
/ 13 февраля 2019

Я осматриваю этот сайт, и ни один из методов не решает мою проблему.В основном я получил этот XML из ответа SOAP через cURL.Проблема в том, что в начале и конце ответа появились странные символы.

Ниже приведен скриншот ответа XML: enter image description here

Не уверен, чточто-то пошло не так в моем коде, пожалуйста, посмотрите

<?php
// error reporting
error_reporting(E_ALL - E_NOTICE); 
ini_set('display_errors','On');

//header('Content-type: text/xml');

$soapUrl = "https://eins2.zurich.com.my/VIXAPI/VixService.svc?wsdl"; //URL of WSDL

// xml post structure

$xml_post_string = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:fnGetVehicleDtlsByVIX>
         <!--Optional:-->
         <tem:VehInputInfo>{"AgentCode":"D02940-000","ParticipantCode":"06","RequestDateTime":"2017-Mar-17 11:00:00 PM","ID":"850321-07-5179","VehNo":"WA823H","Signature":"E448A5DE70160A7C541306B38ABAE3C8826ACD262DF217F9AA8B32244374C5E2E66D26D31874BBD832E43A6A569D20F2DFE8F674AECCFD698850BEBFB13767FD"}</tem:VehInputInfo>
      </tem:fnGetVehicleDtlsByVIX>
   </soapenv:Body>
</soapenv:Envelope>';


$headers = array(
            "POST: https://eins2.zurich.com.my/VIXAPI/VixService.svc HTTP/1.1",
            "Content-type: text/xml;charset=\"UTF-8\"",
            "Accept-Encoding: gzip,deflate",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
            "SOAPAction: \"http://tempuri.org/IVixService/fnGetVehicleDtlsByVIX\"", 
            "Content-Length: ".strlen($xml_post_string),
            "Host: eins2.zurich.com.my",
            "Connection: Keep-Alive"
        );
$url = $soapUrl;

//print_r($headers);

// PHP cURL  for https connection with auth
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_USERPWD, $soapUser.":".$soapPassword); // username and password - declared at the top of the doc
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // the SOAP request
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

// converting
$response = curl_exec($ch); 
curl_close($ch);

print_r($response);
    ?>

Заранее спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

сначала обратитесь к ребятам eins2.zurich.com.my и сообщите об этом как об ошибке на их сервере, и они должны это исправить.проблема заключается в том, чтобы заставить ваш код работать до тех пор, пока они его не исправят.

я могу сразу подумать о 2 решениях,

1: если число нежелательных байтов постоянно, вы можете проверить ответ с помощьюшестнадцатеричный редактор (например, HxD ) для подсчета количества нежелательных байтов, а затем с помощью substr () их удалите.enter image description here

здесь я считаю 15 нежелательных байтов в начале строки, а enter image description here

здесь я считаю 8 нежелательных байтовв конце строки.если это ВСЕГДА 15 байт + 8 байт, вы можете исправить это следующим образом:

$response=substr($response,15,-8);

см. https://3v4l.org/UURms

  • НО, который не будет работать, если количество нежелательных байтовпеременная, что приводит меня к решению # 2

, если нежелательные байты никогда не содержат < или >, тогда вы можете использовать strpos (), чтобы найти первые <, и strrpos (), чтобы найти последний <, и использовать substr (), чтобы удалить все до и после ..

например

$response=substr($response,strpos($response,'<'));
$response=substr($response,0,strrpos($response,'>')+1);

(или если вы хотите однострочник ...$response=substr(($response=substr($response,strpos($response,'<'))),0,strrpos($response,'>')+1);, но нет, не делайте этого.)

например, https://3v4l.org/Q8JiC

  • НО, который не будет работать, если нежелательные байты содержат < или > ... если они содержат их, а число нежелательных байтов является переменным, тогда я не могу придумать решение прямо сейчас ..
...