You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:14:07