PHP cURL请求XML接口返回纯字符串,如何解析为变量?
解决PHP cURL获取XML后解析为变量的问题
嘿,我来帮你搞定这个问题!首先咱们得弄明白为啥会出现这种情况:浏览器访问时能看到完整XML(审查元素里),但cURL返回纯字符串,大概率是请求头不匹配——浏览器会自动发送一些表明接受XML格式的头信息,而默认的cURL请求没带这些,导致服务器返回的XML被当成纯文本输出了。
下面是具体的解决步骤:
第一步:修正cURL请求,确保获取到正确的XML内容
先调整你的cURL代码,添加必要的请求头,让服务器返回标准的XML格式:
$url = 'http://old.lb.lt/webservices/FxRates/FxRates.asmx/getCurrentFxRates?tp=EU'; // 初始化cURL $ch = curl_init($url); // 设置cURL选项,确保响应不直接输出,而是返回给变量 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 添加Accept头,明确告诉服务器我们需要XML格式的响应 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Accept: application/xml', 'Content-Type: application/x-www-form-urlencoded' ]); // 这里提个小疑问:原接口方法名是getCurrentFxRates,浏览器用GET就能访问,你可以测试下是否需要POST // 如果不需要POST,就注释掉下面两行;如果确实需要POST,保留并补充参数 // curl_setopt($ch, CURLOPT_POST, true); // curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([])); // 执行请求并获取响应 $response = curl_exec($ch); // 检查请求是否失败 if ($response === false) { die('cURL请求出错: ' . curl_error($ch)); } // 关闭cURL资源 curl_close($ch);
第二步:将XML响应解析为PHP变量
拿到正确的XML内容后,有两种常用的解析方式,按需选择:
方式一:SimpleXML(简单易用,适合结构不复杂的XML)
// 加载XML字符串 $xml = simplexml_load_string($response); // 检查解析是否成功 if ($xml === false) { echo 'XML解析失败:'; foreach(libxml_get_errors() as $error) { echo '<br>' . $error->message; } } else { // 直接以对象形式访问XML节点 // 举个例子,假设XML里有<FxRate>节点,遍历获取汇率信息: foreach ($xml->FxRate as $rate) { echo '货币代码:' . $rate->Currency . ',汇率:' . $rate->Rate . '<br>'; } // 如果习惯用数组,也可以转成关联数组 $xmlArray = json_decode(json_encode($xml), true); print_r($xmlArray); }
方式二:DOMDocument(更灵活,适合复杂XML结构)
$dom = new DOMDocument(); // 禁用XML格式错误的强制提示,避免小问题导致解析失败 libxml_use_internal_errors(true); $dom->loadXML($response); libxml_clear_errors(); // 示例:获取所有<FxRate>节点并提取内容 $fxRates = $dom->getElementsByTagName('FxRate'); foreach ($fxRates as $rate) { $currency = $rate->getElementsByTagName('Currency')->item(0)->nodeValue; $rateValue = $rate->getElementsByTagName('Rate')->item(0)->nodeValue; echo '货币代码:' . $currency . ',汇率:' . $rateValue . '<br>'; }
额外提示
你可以先打印$response看看内容,如果还是纯文本,那大概率是请求头或者请求方式的问题,调整后应该就能看到带标签的XML了。
内容的提问来源于stack exchange,提问作者The50
相关产品推荐
相关产品推荐

