PHP-从XML移除奇怪的字符

时间:2019-02-13 14:28:21

标签: php xml curl soap

我到处都是这个网站,没有一种方法可以解决我的问题。 基本上,我是通过cURL从SOAP响应中获得此XML的。 问题是,响应的开头和结尾都有一些奇怪的字符。

下面是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 :(得分:1)

首先联系eins2.zurich.com.my,并将其报告为服务器中的错误,然后应予以修复。问题是使您的代码可以正常工作,直到他们修复它。.

我可以立即想到两种解决方案,

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

  • 但是如果不需要的字节包含<>的话将不起作用...如果它们确实包含这些字节,并且不需要的字节数是可变的,那么我想不起来一个解决方案。.