如果我在浏览器上运行此链接,我会得到正确的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(在页面的最底部)。
您可以使用simplexml_load_string()
将字符串转换为XML对象:
$xmlstring = curl_exec($ch);
$xml = simplexml_load_string($xmlstring);
foreach ($xml->FxRate as $rate) {
echo (string)$rate->Tp ;
}
当我转储响应时,我只得到一个字符串
是的,通过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,你可以在PHP手册中找到使用它的基本示例。
(请不要试图将整个XML文档转换为数组 - XML的结构不适合简单的数组,而SimpleXML旨在很好地为您应对这种复杂性;一旦您习惯了它,它就会做得很好。
此外,我将响应设置为:
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/x-www-form-urlencoded' ));
这不是设置与响应有关的任何内容;它向API发送HTTP标头,指定您发送的数据格式;具体来说,您以浏览器提交HTML表单时使用的格式发送它。