如何在PHP中将XML字符串解析为数组?Curl XML解析空对象问题
解决PHP解析Curl返回XML为空的问题
问题核心
你遇到的解析空对象问题,大概率是因为Curl返回的XML包含非XML格式的多余字符(比如你示例里的反引号、末尾分号),或者XML本身存在格式/编码问题,导致simplexml_load_string无法正常解析。
解决步骤
1. 清理XML内容
先去除Curl返回内容里的多余字符(反引号、分号、首尾空白等),确保传入解析函数的是纯XML字符串:
// 假设$curlResponse是Curl获取到的原始响应内容 $cleanXml = trim($curlResponse); // 移除首尾的反引号和分号(根据实际返回的多余字符调整) $cleanXml = trim($cleanXml, "`;");
2. 启用错误捕获排查问题
如果清理后仍解析失败,开启XML错误捕获,查看具体失败原因:
// 启用XML内部错误捕获 libxml_use_internal_errors(true); $xml = simplexml_load_string($cleanXml); if (!$xml) { echo "XML解析错误详情:"; foreach (libxml_get_errors() as $error) { echo "<br>" . $error->message; } libxml_clear_errors(); }
3. 正常解析并提取值
确认XML格式正确后,即可正常提取节点值:
if ($xml) { // 提取单个节点值(强制转为字符串避免对象输出) $title = (string)$xml->title; $from = (string)$xml->from; $to = (string)$xml->to; $body = trim((string)$xml->body); // 输出结果 echo "标题:{$title}<br>"; echo "发件人:{$from}<br>"; echo "收件人:{$to}<br>"; echo "内容:{$body}"; }
完整示例代码
<?php // 模拟Curl返回的原始XML内容 $curlResponse = <<<RAW ` <?xml version='1.0'?> <document> <title>Forty What?</title> <from>Joe</from> <to>Jane</to> <body> I know that's the answer -- but what's the question? </body> </document>`; RAW; // 清理XML内容 $cleanXml = trim($curlResponse); $cleanXml = trim($cleanXml, "`;"); // 启用错误捕获并解析 libxml_use_internal_errors(true); $xml = simplexml_load_string($cleanXml); if (!$xml) { echo "XML解析错误详情:"; foreach (libxml_get_errors() as $error) { echo "<br>" . $error->message; } libxml_clear_errors(); } else { // 提取并输出值 $title = (string)$xml->title; $from = (string)$xml->from; $to = (string)$xml->to; $body = trim((string)$xml->body); echo "标题:{$title}<br>"; echo "发件人:{$from}<br>"; echo "收件人:{$to}<br>"; echo "内容:{$body}"; } ?>
内容的提问来源于stack exchange,提问作者Jonathan COHEN
相关产品推荐
相关产品推荐

