最常用且可靠的方式是使用 SimpleXML 配合 json_encode/json_decode,或用 DOMDocument 手动遍历;不推荐正则匹配和已废弃的 xml_parse 系列函数。

PHP 解析 XML 并转为数组,最常用且可靠的方式是使用 SimpleXML 配合 json_encode/json_decode,或用 DOMDocument 手动遍历。不推荐直接正则匹配,也不建议用已废弃的 xml_parse 系列函数。
用 SimpleXML + json_decode 一键转数组
这是最简洁的方法,适合结构清晰、无命名空间、无特殊字符(如 CDATA)的 XML:
- 先用
simplexml_load_string()或simplexml_load_file()加载 XML,得到 SimpleXMLElement 对象 - 再用
json_encode()转成 JSON 字符串,接着用json_decode($json, true)转为关联数组 - 注意:SimpleXML 会把属性转为
@attributes键,文本内容默认放在0键或直接作为字符串(取决于是否混用子节点)
示例:
$xml = '<root><item id="1"><name>Apple</name><price>5.99</price></item></root>'; $obj = simplexml_load_string($xml); $arr = json_decode(json_encode($obj), true); // 结果中 $arr['item']['@attributes']['id'] 是 '1',$arr['item']['name'] 是 'Apple'
处理带命名空间的 XML
SimpleXML 支持命名空间,但转数组前需先用 children($ns, true) 显式提取:
立即学习“PHP免费学习笔记(深入)”;
- 调用
$obj->children('http://example.com/ns', true)获取指定命名空间下的子元素 - 若多个命名空间,需分别处理;转数组时仍走 json_encode → json_decode 流程
- 属性仍通过
@attributes访问,命名空间前缀不会自动保留,需手动映射
用 DOMDocument 更精细地控制解析
当 XML 含 CDATA、注释、处理指令,或需跳过特定节点时,DOM 更稳妥:
- 创建
DOMDocument实例,调用loadXML()或load() - 用
getElementsByTagName()或xpath查询节点,逐个读取nodeValue、getAttribute()、childNodes - 手动构建数组结构,可自定义键名、过滤空值、展开同名多节点为数组
- 比 SimpleXML 略繁琐,但逻辑清晰、容错性强
注意事项和常见坑
转换过程容易忽略的细节:
- XML 编码必须与实际一致(如 UTF-8),否则
simplexml_load_string可能报错,可用mb_convert_encoding()预处理 - 根节点只有一个,若 XML 有多个顶层元素,需包裹一层或分次解析
- 数值型内容(如
<count>42</count>)在数组中仍是字符串,如需自动转换,得后处理 - 空标签(
<desc/>)会被转为空字符串,不是null或''需自行判断



















