作为XML的PHP​​ cURL响应显示为纯字符串

时间:2018-03-07 15:29:10

标签: php curl post

如果我在浏览器上运行此链接,我会得到正确的XML格式响应:http://old.lb.lt/webservices/FxRates/FxRates.asmx/getCurrentFxRates?tp=EU

现在,如果我使用cURL运行同一链接的POST请求,并且当我转储响应时,我只得到一个字符串。如果我做

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

然后我的浏览器会显示没有XML标签的响应,但如果我检查页面,我会看到所有的XML标签都看起来不错。

如何将所有XML标记解析为变量,我该怎么做?

我也将响应设置为:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/x-www-form-urlencoded'
));

如此处的文档中所述http://www.lb.lt/webservices/FxRates/FxRates.asmx?op=getCurrentFxRates(位于页面底部)。

2 个答案:

答案 0 :(得分:2)

您可以使用simplexml_load_string()将字符串转换为XML对象:

$xmlstring = curl_exec($ch); 
$xml = simplexml_load_string($xmlstring);
foreach ($xml->FxRate as $rate) {
   echo (string)$rate->Tp ;
}

答案 1 :(得分:2)

  

当我转储响应时,我只得到一个字符串

是的,HTTP上任何的输出是一串字节。在这种情况下,该字符串是XML文档的内容。

  

然后我的浏览器显示响应,没有XML标记

这是因为PHP默认告诉浏览器将其输出解释为HTML;当浏览器将XML解释为HTML时,它只是忽略所有无法识别的标签,并输出它们之间的任何内容。

您可以使用htmlspecialchars()在HTML文档中对XML进行编码,或者通过设置内容类型标题指示浏览器将其解释为XML:

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

如果我检查页面,我会看到所有的XML标签都很好看。

浏览器中的“查看来源”视图或DOM检查器仍在将内容解释为HTML,但旨在显示所有标记(已识别的标记,如<div><p>,以及无法识别的标记比如<some-xml-tag>)。

  

如何将所有XML标记解析为变量,我该怎么做?

那么,这取决于你想要的变量类型;如果我们想要从字面上理解这个问题,你所拥有的字符串就是一个已包含XML的变量。

您最需要的是 XML解析器,它允许您从XML中获取一些数据并在PHP中执行某些操作,最简单的解析器适当地称为 SimpleXML ,您可以找到basic examples for using it in the PHP manual

(请不要试图将整个XML文档转换为数组 - XML的结构不适合简单的数组,而SimpleXML旨在为您很好地应对这种复杂性;它做得很好,一旦你习惯了它。)

  

我也将响应设置为:

     

curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/x-www-form-urlencoded' ));

这与响应没有任何关系;它正在向API发送HTTP标头,指定您发送的数据的格式;具体而言,如果您提交了HTML表单,那么您将以浏览器将使用的格式发送它。