PHP实现XML转数组的两种方式及注意事项

咖啡半糖
咖啡半糖
发布时间:2026-10-13| 4人浏览过
原创

将XML数据转换为PHP关联数组是开发中常见需求。本文介绍两种核心方案:通过 simplexml_load_string 配合JSON中转的快速方法,以及基于 DOMDocument 递归遍历的灵活方法,并附安全转换代码示例。

方法一:使用 SimpleXML 中转 JSON

这是最简洁的实现方式。PHP 的 SimpleXML 扩展可将 XML 字符串直接解析为对象,随后借助 json_encode 和 json_decode 将其无缝转换为多维数组。此方法代码量少,适合结构相对简单的 XML 数据。

操作步骤:

  1. 准备 XML 数据:将待转换的 XML 字符串赋值给变量。
  2. 解析为对象:调用 simplexml_load_string() 生成 SimpleXMLElement 实例。
  3. 转为 JSON:使用 json_encode() 序列化对象。
  4. 转为数组:使用 json_decode($json, true) 获取关联数组。
$xmlData = '<root><name>John Doe</name><age>30</age></root>';
$xml = simplexml_load_string($xmlData);
$json = json_encode($xml);
$array = json_decode($json, true);
print_r($array);

方法二:使用 DOMDocument 递归转换

当 XML 结构复杂、包含多层嵌套或需要精确控制属性映射时,DOMDocument 提供了更底层的操作能力。该方法通过递归函数遍历 DOMNodeList,手动构建数组结构,能够处理属性和子节点的混合内容。

核心逻辑:

  • 初始化:创建 new DOMDocument() 并使用 loadXML() 加载数据。
  • 递归处理:定义辅助函数 domToArray(),判断当前节点是否为元素节点或文本节点。
  • 属性映射:若节点拥有属性,将其名称和值存入数组对应键位。
  • 返回值:返回重构后的数组结构。
$xmlData = '<root><name>John Doe</name><age>30</age></root>';
$xml = new DOMDocument();
$xml->loadXML($xmlData);
$array = domToArray($xml->documentElement);
print_r($array);

function domToArray($node) {
    $array = array();
    if ($node->hasAttributes()) {
        foreach ($node->attributes as $attr) {
            $array[$attr->nodeName] = $attr->nodeValue;
        }
    }
    if ($node->hasChildNodes()) {
        foreach ($node->childNodes as $childNode) {\n            if ($childNode->nodeType == XML_ELEMENT_NODE) {
                $array[$childNode->nodeName] = domToArray($childNode);
            } else if ($childNode->nodeType == XML_TEXT_NODE) {
                $array['value'] = $childNode->nodeValue;
            }
        }
    }
    return $array;
}

补充:实用工具函数与安全建议

在实际业务(如微信支付接口对接)中,常需处理带有 <![CDATA[]]> 标签的 XML。直接使用标准转换可能导致数据格式异常,建议采用以下封装好的工具函数,并开启安全限制以防范 XXE 攻击。

完整转换工具集

XML 转数组(推荐):
使用 LIBXML_NOCDATA 标记将 CDATA 内容展平为文本,并结合 libxml_disable_entity_loader(true) 禁用外部实体加载。

// Xml转数组
function XmlToArr($xml)
{	
	if($xml == '') return '';
	libxml_disable_entity_loader(true);
	$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);		
	return $arr;
}

数组转 XML:
对于数值类型直接输出文本,对于字符串类型自动包裹 <![CDATA[...]]> 以防止特殊字符冲突。

//数组转xml
function ArrToXml($arr)
{
	if(!is_array($arr) || count($arr) == 0) return '';
	
	$xml = "<xml>";
	foreach ($arr as $key=>$val)
	{
		if (is_numeric($val)){
			$xml.="<".$key.">".$val."</".$key.">";
		}else{
			$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
		}
	}
	$xml.="</xml>";
	return $xml; 
}

自定义清理函数

若 XML 头部存在非标准声明(如自定义 ),可在转换前通过 str_replace() 进行替换处理,避免解析失败。

function xmlToArray(string $xml, $oldStr = [], $newStr = [])
{
    //过滤特殊xml 格式
    if (!empty($oldStr)) {
        $xml = str_replace($oldStr, $newStr, $xml);
    }
    $objectXml = simplexml_load_string($xml);
    $xmlJson = json_encode($objectXml);
    $xmlArray = json_decode($xmlJson, true);
    return $xmlArray;
}
以上就是PHP实现XML数据转数组相关详细内容,更多关于PHP XML转数组技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。