如果我在浏览器上运行此链接,我会得到正确的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(位于页面底部)。
答案 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表单,那么您将以浏览器将使用的格式发送它。