SimpleXMLElement对象不能直接强转为标准数组,因其内部通过魔术方法动态访问数据,无真实键值对;推荐用json_encode+json_decode转换,或手动递归处理属性与嵌套结构。

SimpleXMLElement 对象不能直接用 (array) 强转成“标准数组”,因为它的结构是对象代理,内部不以普通 PHP 数组形式存储数据。直接强转只会得到一个空数组或仅含部分属性的浅层结构。
为什么直接转数组不行
SimpleXMLElement 是 DOM 封装类,其子元素、属性、文本内容都通过魔术方法(__get、__toString)动态访问,没有真实键值对存于数组结构中。例如:
$xml = simplexml_load_string('<root><name>张三</name><age>25</age></root>');(array)$xml 得到的是 ['name' => {SimpleXMLElement}, 'age' => {SimpleXMLElement}],不是字符串值。
推荐:用 json_encode + json_decode 一步到位
这是最简洁、兼容性好、能处理嵌套和属性的方式:
- 先用
json_encode($xml)把整个 XML 转成 JSON 字符串(SimpleXMLElement 支持 JSON 序列化) - 再用
json_decode(..., true)解析为关联数组
示例:
$arr = json_decode(json_encode($xml), true);
结果:['name' => '张三', 'age' => '25']
⚠️ 注意:如果 XML 有属性(如 <item id="101"></item>),默认会被忽略;需配合 LIBXML_NOCDATA 和自定义封装或使用下述方法。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
需要保留属性时:手动递归转换
当 XML 含属性(@attributes)、混合文本与子节点、或 CDATA 内容时,建议写一个轻量递归函数:
function simplexml_to_array($xml) {<br>
$arr = [];<br>
foreach ($xml->children() as $key => $val) {<br>
$arr[$key] = (string)$val;<br>
if ($val->attributes()) {<br>
$arr[$key]['@attributes'] = [];<br>
foreach ($val->attributes() as $a => $v) {<br>
$arr[$key]['@attributes'][$a] = (string)$v;<br>
}<br>
}<br>
}<br>
return $arr;<br>
}
该函数可按需扩展支持多层嵌套、重复标签合并等逻辑。
补充说明
PHP 8.1 中 SimpleXMLElement 行为未改变,上述方法完全适用。不建议依赖 get_object_vars() 或 iterator_to_array(),它们无法正确提取文本内容或处理命名空间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










