
本文详解如何在 PHP 中通过 cURL 发送 XML 请求,并将返回的 XML 字符串正确解析为可操作的 SimpleXML 对象,从而安全访问 <Sku> 等节点内容,避免因类型误判导致的属性访问失败。
本文详解如何在 php 中通过 curl 发送 xml 请求,并将返回的 xml 字符串正确解析为可操作的 simplexml 对象,从而安全访问 `
你当前的脚本已成功通过 cURL 向 API 发起 XML 格式的 GET 请求,并获取了服务器响应——但需注意:curl_exec() 返回的是原始字符串(如 <?xml version="1.0"?><response><Sku>210-AZBVTBC4</Sku></response>),而非 XML 文件路径或对象。因此直接尝试 $response->Sku 会报错:Trying to get property 'Sku' of non-object,因为 $response 是字符串,不支持对象式属性访问。
✅ 正确做法是使用 simplexml_load_string() 将 XML 字符串解析为 SimpleXML 对象:
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://www.xxxxx.com/webAPI/api/stock',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_POSTFIELDS => '<?xml version="1.0" encoding="utf-8"?>
<traderapi>
<token>T1a5c3t9</token>
<variant>Clearbank ltd</variant>
<pon>X</pon>
</traderapi>',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer T1a5c3t9',
'Content-Type: application/xml'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
// ✅ 关键步骤:检查响应有效性后解析 XML 字符串
if ($response === false || $httpCode !== 200) {
throw new RuntimeException('cURL request failed: ' . curl_error($curl) . ' (HTTP ' . $httpCode . ')');
}
// 将 XML 字符串转换为 SimpleXML 对象
$xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($xml === false) {
libxml_clear_errors();
throw new RuntimeException('Failed to parse XML response');
}
// 现在可安全访问节点(注意:SimpleXML 返回的是对象,但属性需强制类型转换)
$sku = (string)$xml->Sku; // 强制转 string,避免输出时隐式转换异常
echo "SKU: " . $sku; // 输出:SKU: 210-AZBVTBC4
// 若响应含多条记录(如 <items><item><Sku>...</Sku></item><item>...</item></items>),可用 foreach 遍历:
// foreach ($xml->items->item as $item) {
// echo (string)$item->Sku . "\n";
// }⚠️ 注意事项:
- 始终校验 curl_exec() 返回值和 HTTP 状态码:空响应或 4xx/5xx 错误会导致 simplexml_load_string() 解析失败或静默返回 false;
- 启用 LIBXML_NOCDATA 可防止 CDATA 段被忽略,确保文本内容完整保留;
- 强制类型转换 (string) 是最佳实践:SimpleXML 元素本质是对象,直接拼接可能触发 __toString() 不一致行为;
- 若 XML 命名空间复杂,需用 ->children('ns', true) 切换命名空间上下文;
- 生产环境建议配合 libxml_use_internal_errors(true) + libxml_get_errors() 进行结构化错误捕获。
掌握这一解析流程后,你不仅能精准提取 <Sku>,还可灵活处理 <variant>、<pon> 等任意字段,为后续数据入库、模板渲染或 API 聚合打下坚实基础。
立即学习“PHP免费学习笔记(深入)”;



















