在PHP后端开发中,经常会碰到前端或其他系统以XML格式提交数据的情况。如果XML结构并不复杂,例如只有几层节点和少量字段,我们可以通过PHP内置功能快速完成接收与解析,而不必引入重量级组件。

一、接收原始的XML数据
当客户端使用POST方法发送XML时,数据通常不会出现在$_POST数组里,而是保存在请求体流中。我们可以用file_get_contents('php://input')来读取。
<?php
// 接收POST过来的原始XML字符串
$xmlString = file_get_contents('php://input');
// 简单判断是否为空
if (empty($xmlString)) {
echo '未接收到XML数据';
exit;
}
// 可先查看内容,调试用
// echo $xmlString;
?>
二、用SimpleXML解析简单结构
PHP的SimpleXML扩展能把XML字符串转成对象,访问子节点就像读属性一样方便。下面示例假设接收到的XML结构如下:
<user>
<name>张三</name>
<age>28</age>
<email>test@ipipp.com</email>
</user>
我们可以使用simplexml_load_string函数解析上面的内容:
<?php
$xmlString = file_get_contents('php://input');
// 转为SimpleXMLElement对象
$data = simplexml_load_string($xmlString);
if ($data === false) {
echo 'XML解析失败';
exit;
}
// 读取节点内容
$name = (string)$data->name;
$age = (int)$data->age;
$email = (string)$data->email;
echo '姓名:' . $name . '<br>';
echo '年龄:' . $age . '<br>';
echo '邮箱:' . $email;
?>
三、处理编码与错误
如果XML带有了声明如<?xml version="1.0" encoding="UTF-8"?>,SimpleXML一般能自动识别。但若出现乱码,可先确保PHP文件本身保存为UTF-8无BOM格式,并在输出时声明头部:
<?php
header('Content-Type:text/html; charset=utf-8');
?>
当XML格式不正确时,simplexml_load_string会返回false。我们可以用libxml_get_errors来排查:
<?php
libxml_use_internal_errors(true);
$data = simplexml_load_string($xmlString);
if ($data === false) {
foreach (libxml_get_errors() as $error) {
echo '行' . $error->line . ':' . $error->message;
}
libxml_clear_errors();
}
?>
四、转成数组的小技巧
有些场景希望把XML对象转成普通数组方便后续处理,可以用强制类型转换配合递归:
<?php
function xmlToArray($xml) {
$result = null;
if (is_object($xml)) {
$xml = get_object_vars($xml);
}
if (is_array($xml)) {
foreach ($xml as $key => $value) {
$result[$key] = is_object($value) || is_array($value)
? xmlToArray($value)
: $value;
}
}
return $result;
}
$arrayData = xmlToArray($data);
print_r($arrayData);
?>
五、小结
对于简单结构的XML,PHP接收的核心就是先用php://input拿原始内容,再用simplexml_load_string解析。注意编码一致与错误捕获,就能稳定地完成数据接收任务。